1. 程式人生 > >老男孩教育每日一題-第61天-使用命令調換 /etc/passwd 文件裏所有的第一列和最後一列位置

老男孩教育每日一題-第61天-使用命令調換 /etc/passwd 文件裏所有的第一列和最後一列位置

sed awk 每日一題 調換位置

老男孩教育每日一題-第61天-使用命令調換 /etc/passwd 文件裏 root 位置和/bin/bash 位置?即將所有的第一列和最後一列位置調換?

例:默認:root:x:0:0:root:/root:/bin/bash

修改後:/bin/bash:x:0:0:root:/root:root

參考答案:

方法1:每列之前由冒號分隔,首先想到awk擅長取列,所以第一種方法使用awk,分隔符冒號

具體方法:每行分3組,第一組字母、數字、下劃線、- 組成,第二組第一個冒號到最後一個冒號,第三組是斜 線(/)到最後,以下給出兩個參考

發現分隔符變成了空格,再使用tr 把分隔符替換成冒號

[email protected]
~ /bin/bash:x:0:0:root:/root:root /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:daemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/var/adm:adm /sbin/nologin:x:4:7:lp:/var/spool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdown:/sbin:shutdown /sbin/halt:x:7:0:halt:/sbin:halt /sbin/nologin:x:8:12:mail:/var/spool/mail:mail ...... 這樣就完成題目要求了

為了省略 $2,$3,...$6這些內容,我們可以直接把第一列和最後一列交換,這裏需要用到自定義變量,得出下 面一個方法awk -F ":" ‘{a=$1;$1=$NF;$NF=a;print}‘ /etc/passwd|tr " " ":"

繼續優化以上方法,使用awk內置變量OFS(輸出分隔符),設置輸出分隔符為冒號awk -F ":" ‘{OFS=":";a=$1;$1=$NF;$NF=a;print}‘ /etc/passwd

方法2:使用sed命令,對每行進行分組正則匹配,然後後向引用輸出

具體方法:每行分3組,第一組字母、數字、下劃線、- 組成,第二組第一個冒號到最後一個冒號,第三組是斜 線(/)到最後,以下給出兩個參考

sed -r ‘s#(^[a-Z0-9_-]+)(:.*:)(/.*$)#\3\2\1#‘ /etc/passwd
sed -r ‘s#(^[^:]+)(:.*:)(/.*$)#\3\2\1#‘ /etc/passwd


今天是每日一題陪伴大家的第60天期待你的進步

對於題目和答案的任何疑問,請在博客評論區留言
往期題目索引

http://lidao.blog.51cto.com/3388056/1914205


本文出自 “李導的博客” 博客,請務必保留此出處http://lidao.blog.51cto.com/3388056/1934816

老男孩教育每日一題-第61天-使用命令調換 /etc/passwd 文件裏所有的第一列和最後一列位置