Awk

如何使用 awk 輸出動態更改目錄的所有者?

  • July 16, 2020

我想做的事 :

  • 獲取使用者及其主目錄列表/etc/passwd
  • 使用使用者名和家庭地址作為參數並將這些目錄的所有權更改為該使用者。

目前輸出:

修剪後的輸出: cat /etc/passwd

##
# User Database
# 
# Note that this file is consulted directly only when the system is running
# in single-user mode.  At other times this information is provided by
# Open Directory.
#
# See the opendirectoryd(8) man page for additional information about
# Open Directory.
##
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false

修剪後的輸出:cat /etc/passwd | grep "^[#;]" -v

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false
_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false

現在我必須刪除開始的’_‘所以我使用了以下命令:

修剪後的輸出:cat /etc/passwd | grep "^[#;]" -v | sed s/"_"//

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico
taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false

awk最後我使用命令取出使用者名和目錄:

cat /etc/passwd | grep "^[#;]" -v | sed s/"_"// | awk -F\: '{print $1" "$6}' (輸出修剪)

nobody /var/empty
root /var/root
daemon /var/root
uucp /var/spool/uucp
taskgated /var/empty
networkd /var/networkd
installassistant /var/empty
lp /var/spool/cups
postfix /var/spool/postfix
scsd /var/empty
ces /var/empty
appstore /var/db/appstore

這就是我想進一步做的事情!

取第一個參數並將第二個參數的所有權分配給它。我應該如何進行?

最後一個文件可以用這種方式在 bash 中處理:

cat YOURFILE | \
while read CMD; do 
  field1=${CMD% *};    # take first field
  field2=${CMD#* };    # take second field
  echo do $field1 with $field2;  # do something with it
done

因此,您必須使用適當的 chown 命令替換 echo 才能使其正常工作。取自在 bash 腳本中逐行讀取

我不確定您是否打算刪除導致_這可能導致chown: _user not foundchown問題

嘗試

awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd

在哪裡

  • -F:告訴 awk:用作分隔符
  • /^#/ { next }跳過以開頭的行#
  • 同樣添加到以(如果需要)/^_/ { next }開頭的跳過行_
  • 下一個模式/動作列印 chown 命令。

如果結果看起來不錯,只需管道到bash

引用自:https://unix.stackexchange.com/questions/598794