[root@hf-01 ~]# mkdir awk [root@hf-01 ~]# cd awk [root@hf-01 awk]# cp /etc/passwd ./test.txt [root@hf-01 awk]# ls test.txt
[root@hf-01 awk]# awk -F ':' '{print $1}' test.txt //打印出第一段內容 root bin daemon adm lp sync shutdown halt 等等等,只截取了一小部分 [root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1}' root bin daemon [root@hf-01 awk]#
awk命令以分隔符爲例,打印出第一段內容——>實際上並未去改變文件內容html
[root@hf-01 awk]# awk -F ':' '{print $0}' test.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync 等等等,只截取了一小部分 [root@hf-01 awk]#
打印第一段用 $1 表示 打印全部的段用 $0 表示mysql
[root@hf-01 awk]# awk -F ':' '{print $1,$2,$4}' test.txt root x 0 bin x 1 daemon x 2 adm x 4 lp x 7 sync x 0 shutdown x 0 等等等,只截取了一小部分 [root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{print $1"@"$2"@"$4}' //在前三行中,打印指定的段,並用 @ 分割 root@x@0 bin@x@1 daemon@x@2 [root@hf-01 awk]#
[root@hf-01 awk]# awk '/oo/' test.txt //打印匹配包含字符oo的行 root:x:0:0:root:/root:/bin/bash lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt root:x:0:0:root:/root:/bin/bash [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行 root:x:0:0:root:/root:/bin/bash daemon:x:2:2:daemon:/sbin:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown operator:x:11:0:operator:/root:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin [root@hf-01 awk]# [root@hf-01 awk]# awk -F ':' '$1 ~ /oo+/' test.txt root:x:0:0:root:/root:/bin/bash [root@hf-01 awk]#
這裏會發現,有特殊符號的時候,grep命令須要加 -E 脫義,sed命令須要加 -r 脫義,而awk命令中的特殊符號則不須要脫義就能夠實現操做sql
[root@hf-01 awk]# awk -F ':' '/root/ {print $1,$3} /usr/ {print $1,$3,$4}' test.txt //匹配包含root的行,打印第1段和第3段,而後在匹配包含usr的行並打印第3段和第4段 root 0 operator 11 games 12 100 [root@hf-01 awk]# grep -E 'root|usr' test.txt root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin [root@hf-01 awk]# [root@hf-01 awk]# awk -F ':' '/root|usr/ {print $0}' test.txt //在文件全部段中,匹配包含root和usr的行 root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin [root@hf-01 awk]# awk -F ':' '/root|usr/ {print $1,$3,$4}' test.txt root 0 0 operator 11 0 games 12 100 [root@hf-01 awk]#
awk工具支持多個表達式一塊兒寫vim
[root@hf-01 awk]# awk -F ':' '$3==0' test.txt //匹配第3段等於0的,並打印全部段 root:x:0:0:root:/root:/bin/bash [root@hf-01 awk]# awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等於0的,並打印第1段 root [root@hf-01 awk]# awk -F ':' '$3>=1000 {print $0}' test.txt //匹配第3段大於等於1000的,並打印全部段 mysql:x:1000:1000::/home/mysql:/bin/bash [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$3>="1000" {print $0}' test.txt daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin mysql:x:1000:1000::/home/mysql:/bin/bash systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等於/sbin/nologin的全部段 root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mysql:x:1000:1000::/home/mysql:/bin/bash [root@hf-01 awk]#
[root@localhost awk]# awk -F ':' '$3<$4' test.txt //比較第3段小於第4段的,並匹配打印出來 adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin [root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大於5的字符,和小於7的字符,並打印出來所在行 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown tss:x:59:59:/var/spool/postfix:/sbin/nologin [root@localhost awk]#
這裏的59是是在字符5和字符7之間的,因此就會匹配出來
[root@localhost awk]# vim test.txt [root@localhost awk]# awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大於94的段,或者第7段等於/sbin/nologin的段所在的行都打印出來 yroot:x:95:95:root:/root bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 等等等,只截取了一部分 [root@localhost awk]#
[root@localhost awk]# awk -F ':' '$3>94 || $7 ~ /bin/' test.txt //匹配第三段大於94的段,或者第7段包含/bin/的段,並都打印出來 yroot:x:95:95:root:/root bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 等等等,只截取了一部分 [root@localhost awk]#
[root@hf-01 awk]# head -n5 test.txt |awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' //在前5行中,匹配第3段大於94的段,或者第七段包含bin的段,而後打印第1,第3,第7段,用 #號 區分 root#0#/bin/bash bin#1#/sbin/nologin daemon#2#/sbin/nologin adm#3#/sbin/nologin lp#4#/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割 nobody@99@/sbin/nologin polkitd@999@/sbin/nologin avahi-autoipd@170@/sbin/nologin mysql@1000@/bin/bash systemd-network@192@/sbin/nologin [root@hf-01 awk]# [root@hf-01 awk]# awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割 nobody@99@/sbin/nologin polkitd@999@/sbin/nologin avahi-autoipd@170@/sbin/nologin mysql@1000@/bin/bash systemd-network@192@/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NR":"$0}' //在前5行中,打印出全部的行 1:root:x:0:0:root:/root:/bin/bash 2:bin:x:1:1:bin:/bin:/sbin/nologin 3:daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# head -n5 test.txt| awk -F ':' '{print NF":"$0}' //在前5行中,打印全部的段 6:rootx:0:0:root:/root:/bin/bash 7:bin:x:1:1:bin:/bin:/sbin/nologin 7:daemon:x:2:2:daemon:/sbin:/sbin/nologin 7:adm:x:3:4:adm:/var/adm:/sbin/nologin 7:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NR<=10' test.txt //打印前十行 rootx:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@hf-01 awk]# [root@hf-01 awk]# awk -F ':' 'NR<=10 && $1 ~ /root|sync/' test.txt //匹配前10行中,第1段包含root或者sync的段,並把這一行打印出來 rootx:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,並在第1段包含root或者sync的段,並把這一行打印出來 rootx:0:0:root:/root:/bin/bash [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{print $NR":"$NF}' test.txt rootx:/bin/bash //文件第一行爲 rootx 匹配最後一段 /bin/bash x:/sbin/nologin //文件第二行爲 x 匹配最後一段 /sbin/nologin 2:/sbin/nologin //......以此類推下去 4:/sbin/nologin lp:/sbin/nologin /sbin:/bin/sync /sbin/shutdown:/sbin/shutdown :/sbin/halt //由於$NR只有七行,因此在打印後面的時候,行爲空 :/sbin/nologin :/sbin/nologin 等等等,只截取了一部分 [root@hf-01 awk]#
[root@hf-01 awk]# head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段賦值爲root root 0 0 root /root /bin/bash root x 1 1 bin /bin /sbin/nologin root x 2 2 daemon /sbin /sbin/nologin [root@hf-01 awk]# head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段賦值爲root,並定義分割符爲: root:0:0:root:/root:/bin/bash root:x:1:1:bin:/bin:/sbin/nologin root:x:2:2:daemon:/sbin:/sbin/nologin [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt 2847 [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中全部包含數字的段,打印出來所在行 rootx:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 等等等,只截取了一部分 [root@hf-01 awk]#
[root@hf-01 awk]# awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中全部包含數字的段,打印出來所在行 rootx:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 等等等,只截取了一部分 [root@hf-01 awk]#
練習題bash
把這裏面的全部練習題作一下 ssh
1.把/etc/passwd 複製到/root/test.txt,用sed打印全部行工具
[root@localhost ~]# cp /etc/passwd /root/test.txt [root@localhost ~]# ls 111 1.txt 2.txt 3.txt awk sed 123 234 2.txt.bak anaconda-ks.cfg grep test.txt [root@localhost ~]# sed -n '1,$'p test.txt
[root@localhost ~]# sed -n '3,10'p test.txt
[root@localhost ~]# sed '/root/'p test.txt
[root@localhost ~]# sed '10,$'d test.txt
sed '/nologin/'d test.txt
sed 's/root/toor/'g test.txt
sed 's#/sbin/nologin#/lalala/AAA/#'g test.txt
sed '5,10s/[0-9]//'g test.txt
sed 's/[^0-9a-zA-Z]//'g test.txt
10.把test.txt中第一個單詞和最後一個單詞調換位置 sed 's/(^[a-zA-Z][a-zA-Z])([^a-zA-Z].)([^a-zA-Z])([a-zA-Z][a-zA-Z]*$)/\4\2\3\1/' test.txtpost
11.把test.txt中出現的第一個數字和最後一個單詞替換位置code
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' test.txt
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
寫法一: sed -r '20,$s/(.*)/aaa:&/'g test.txt 寫法二: sed '20,$s/^.*$/aaa:&/'g test.txt
sed裏面的p 是打印, g 是全局替換 d 是刪除 -n 參數是要和 p 一塊兒使用htm
sed '{print $0}' test.txt sed -F ':' '{print $0}' test.txt
2.查找全部包含 ‘bash’ 的行
awk '/bash/' test.txt awk -F ':' '$0 ~ /bash/' test.txt
awk -F ':' '$3=="0"' test.txt
[root@localhost ~]# awk -F ':' '$1=="root"' test.txt |sed 's/root/lll/' lll:x:0:0:root:/root:/bin/bash
awk -F ':' '{print $NR}' test.txt
[root@localhost ~]# awk -F ':' 'NR>20 {print $0}' test.txt
awk -F ':' '$3<$4 {print $0}' test.txt
awk -F ':' '{print $1"@"$NF}' test.txt
awk -F ':' '{if(sum+=$4)}; END {print sum}' test.txt