Awk
如何使用 awk 輸出動態更改目錄的所有者?
我想做的事 :
- 獲取使用者及其主目錄列表
/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 found
的chown
問題嘗試
awk -F: '/^#/ { next } {printf "chown %s \"%s\"\n",$1,$6} ' my_etc_passwd
在哪裡
-F:
告訴 awk:
用作分隔符/^#/ { next }
跳過以開頭的行#
- 同樣添加到以(如果需要)
/^_/ { next }
開頭的跳過行_
- 下一個模式/動作列印 chown 命令。
如果結果看起來不錯,只需管道到
bash