linux基礎(day28)

9.6 awk(上)

awk工具

  • head -n2 test.txt|awk -F ':' '{print $1}'
  • head -n2 test.txt|awk -F ':' '{print $0}'
  • awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  • awk '/oo/' test.txt
  • awk -F ':' '$1 ~/oo/' test.txt
  • awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  • awk -F ':' '$3=="0"' /etc/passwd
  • awk -F ':' '$3>="500"' /etc/passwd
  • awk -F ':' '$3>=500' /etc/passwd
  • awk -F ':' '$7!="/sbin/nologin"' /etc/passwd

awk功能前的準備工做

  • awk比sed更豐富的功能是,支持分段
[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

awk命令 指定分割符

  • awk -F ':' '{print $1}' test.txt //打印出第一段內容
    • 分割符爲 :
  • head -n3 test.txt |awk -F ':' '{print $1}' //在文件前3行中,打印第一段內容
[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

awk命令 指定打印某一段

  • awk -F ':' '{print $0}' test.txt //打印出全部的段
[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

awk命令 指定打印多段內容,並指定以什麼爲分割

  • awk -F ':' '{print $1,$2,$4}' test.txt //打印指定的分段,第一段,第二段,第四段
    • 在打印多段內容的時候,只須要加 , 逗號 繼續添加便可
  • awk -F ':' '{print $1"@"$2"$4"}' test.txt //在前三行中打印指定的段,並指定用@ 進行分割
    • 括號裏面的分隔符,能夠爲 @ # 均可以使用
    • 括號裏面的指定的分隔符,須要使用 "" 雙引號標註出來
[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]#

awk命令 打印全部文件內容

  • 若使用awk命令,忽略了使用 -F (沒有指定分割符),那麼它默認將會以 空格 或 空白字符 爲分割符去打印
  • awk '{print $0}' test.txt //打印出文件的全部內容——>至關於cat命令查看 [root@hf-01 awk]# awk '{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 等等等,只截取了一小部分 [root@hf-01 awk]#

awk匹配功能(相似於grep命令的功能)

awk命令匹配打印包含字符的行

  • awk '/oo/' test.txt //打印匹配包含字符oo的行
[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]#

awk命令匹配打印某一段中包含字符的行

  • awk -F ':' '$1 ~ /oo/' test.txt //打印第一段中包含oo的行
[root@hf-01 awk]# awk -F ':' '$1 ~ /oo/' test.txt
root:x:0:0:root:/root:/bin/bash
[root@hf-01 awk]#
  • awk -F ':' '$1 ~ /o+/' test.txt //匹配第一段中包含o字符的行
    • +號,表示一個或或多個+號前面的字符
[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

awk工具支持多個表達式一塊兒寫

  • awk -F ':' '/root/ {print $1,$3} /usr/ {print $3,$5}' test.txt //匹配包含root的行,打印第1段和第3段,而後在匹配包含usr的行並打印第3段和第4段
  • awk -F ':' '/root|usr/ {print $0}' test.txt //在文件全部段中,匹配包含root和usr的行
[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

awk工具針對數學表達式

加單引號

  • awk -F ':' '$3==0' test.txt //匹配第3段等於0的,並打印全部段
    • 必須寫 兩個等於號,寫一個等於號就至關於 賦值
  • awk -F ':' '$3==0 {print $1}' test.txt //匹配第3段等於0的,並打印第1段
  • awk -F ':' '$3>=1000' test.txt //匹配第3段大於等於1000的,並打印全部段
[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]#

加雙引號

  • awk -F ':' '$3>="500"' test.txt //第三段大於等於500的
    • 加上雙引號後,會看到第三段的輸出的內容,都是以ascii碼的排序方式去計算的,它會認爲這是一個字符串,而不是一個數字去計算——>若需求是針對數字的,必定不能夠加 雙引號 !!!
[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]#
  • 如果字符串,則須要加上雙引號
  • awk -F ':' '$7!="/sbin/nologin" {print $0}' test.txt //匹配打印出第7段不等於/sbin/nologin的全部段
[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]#

9.7 awk(下)

awk工具

  • awk -F ':' '$3<$4' /etc/passwd
  • awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
  • awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
  • head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘
  • awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd
  • head -n3 /etc/passwd | awk -F ':' '{print NF}‘
  • head -n3 /etc/passwd | awk -F ':' '{print NR}‘
  • awk 'NR>40' /etc/passwd
  • awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
  • head -n 3 /etc/passwd |awk -F ':' '$1="root"‘
  • awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
  • awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd

awk工具 兩個字段相互比較

  • awk -F ':' '$3<$4' test.txt //比較第3段小於第4段的,並匹配打印出來
[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]#

awk工具 兩個字段相等

  • awk -F ':' '$3==$4' test.txt //匹配出第3段和第4段相等的行
[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]#

awk工具 匹配大於5的字符,小於7的字符

  • awk -F ':' '$3>"5" && $3<"7"' test.txt //匹配第3段大於5的字符,和小於7的字符,並打印出來所在行
    • 這裏雙引號裏面的數字表示 字符 ——>經過ASCII碼進行比較
      • 數字比大寫字母小,大寫字母比小寫字母小
      • 用雙引號中字符的的第1個字符去和第3段進行比較
    • && 表示 和 的意思
[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之間的,因此就會匹配出來

awk工具 匹配大於94的段,或等於/sbin/nologin的段

  • awk -F ':' '$3>94 || $7=="/sbin/nologin"' test.txt //匹配第3段大於94的段,或者第7段等於/sbin/nologin的段所在的行都打印出來
    • || 表示 或者 的意思
[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]#

awk工具 匹配的段不精準匹配 ~

  • awk -F ':' '$3>94 || $7 ~ /bash/' test.txt //匹配第三段大於94的段,或者第7段包含/bin/的段,並都打印出來
    • == 就是嚴格匹配
    • ~ 這個只要包含就算匹配
    • 舉例:
    • == 的話,第七段只能爲/bin/bash纔算符合
    • ~ 的話,第七段裏只要有bash 就算符合,好比/sbin/bash, bin123 都算匹配
[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]#

awk工具 OFS

  • 如有多段的時候,分隔符能夠用 # @ 替換,指定分隔符;還有另一個功能,就是OFS,這是一個內置的變量,
    • -F 這是指定分段前的字符
    • OFS用來指定 print 時候用到的分隔符—>注意 語法!!
      • 先寫OFS,在些print
  • awk -F ':' '{OFS="#"} $3>94 || $7 ~ /bin/ {print $1,$3,$7}' test.txt //匹配第3段大於94的段,或者第七段包含bin的段,而後打印第1,第3,第7段,用 #號 區分
    • 語法:在分割完以後,單引號裏面用花括號括起來,給它指定print用到的分隔符OFS ,而後再寫條件,最後在寫print語句
[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]#
  • awk -F ':' '{OFS="@"} {if ($3>94) {print $1,$3,$7}}' test.txt //匹配第3段大於第九段的字符,而後打印第1,第3,第7段內容, 並用@分割
    • 匹配的分隔符,能夠爲@,能夠爲#
  • 上下表達式相同
    • 在使用if的時候,須要加一些符號,可是使用if 的表達式則更加規範
  • awk -F ':' '{OFS="@"} $3>94 {print $1,$3,$7}' test.txt
[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]#

awk工具 兩個內置的變量

  • OFS是打印print的時候,指定的變量符
  • NR 表示 行
  • NF 表示 段
  • head -n5 test.txt |awk -F ':' '{print NR":"$0}' test.txt //在前5行中,打印出全部的行
    • 這個就像grep的-n功能,顯示全部行號
[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]#
  • head -n5 test.txt |awk -F ':' '{print NF":"$0}' test.txt //在前5行中,打印全部的段
    • 在段的前面看到的數字,顯示的是每一行有幾段內容
[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]#

awk工具 NR 表示 行

  • sed -n '1,10'p test.txt //打印前十行
  • awk -F ':' 'NR<=10' test.txt //打印前十行
    • NR 表示 行,可做爲一個判斷條件
  • awk -F ':' 'NR<=10 && $1 ~ /root|sync' test.txt //匹配前10行中,第1段包含root或者sync的段,並把這一行打印出來
[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]#

awk工具 NF 表示 段

  • awk -F ':' 'NF==6 && $1 ~ /root|sync/' test.txt //匹配文件中,是6段的行,並在第1段包含root或者sync的段,並把這一行打印出來
    • NF 表示 段
[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]#

awk工具 $NR":"$NF

  • awk -F ':' '{print $NR":"$NF}' test.txt //就是文件的第幾行一直匹配最後一段,一直持續到第七段結束(只有7段,因此後面爲空) - $NR 表示多少行 - $NF 表示7段
    • 因此打印的內容爲,第一行爲
[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]#

awk工具 賦值

  • head -n3 test.txt |awk -F ':' '$1="root"' //在前3行中,第1段賦值爲root
    • 一旦賦值以後,會看到分隔符消失了
    • 這時只須要定義下 OFS 便可
      • head -n3 test.txt |awk -F ':' '{OFS=":"} $1="root"' //在前3行中,第1段賦值爲root,並定義分割符爲:
[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]#

awk工具 tot值求和

  • awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt //每次tot值循環,就會把第三段相加
    • tot 表示求和
      • 在第一次tot求和的時候,是爲0與第3段相加,而後依次循環,一直到第3段結束,而後輸出tot值
[root@hf-01 awk]# awk -F ':' '{(tot=tot+$3)}; END {print tot}' test.txt
2847
[root@hf-01 awk]#

awk工具 打印文本中全部數字

  • awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中全部包含數字的段,打印出來所在行
[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]#

awk工具 打印文本中全部數字

  • awk -F ':' '$0 ~ /[0-9]/' test.txt //匹配文本中全部包含數字的段,打印出來所在行
[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

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
  • 2.打印test.txt的3到10行
[root@localhost ~]# sed -n '3,10'p test.txt
  • 3.打印test.txt 中包含 ‘root’ 的行
[root@localhost ~]# sed '/root/'p test.txt
  • 4.刪除test.txt 的15行以及之後全部行
[root@localhost ~]# sed '10,$'d  test.txt
  • 5.刪除test.txt中包含 ‘nologin’ 的行
sed '/nologin/'d test.txt
  • 6.替換test.txt 中 ‘root’ 爲 ‘toor’
sed 's/root/toor/'g test.txt
  • 7.替換test.txt中 ‘/sbin/nologin’ 爲 ‘/lalala/AAA/’
sed 's#/sbin/nologin#/lalala/AAA/#'g test.txt
  • 8.刪除test.txt中5到10行中全部的數字
sed '5,10s/[0-9]//'g test.txt
    • []不屬於特殊符號,因此不須要脫義,{}和()是須要脫義的
    • 把數字替換爲空,就表示刪除
  • 9.刪除test.txt 中全部特殊字符(除了數字以及大小寫字母)
sed  's/[^0-9a-zA-Z]//'g test.txt
    • 這裏在使用-r 參數和不使用-r 參數,其表達效果是相同的
  • 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
  • 12.把test.txt 中第一個數字移動到行末尾
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
  • 13.在test.txt 20行到末行最前面加 ‘aaa:’
寫法一:
sed -r '20,$s/(.*)/aaa:&/'g test.txt

寫法二:
sed '20,$s/^.*$/aaa:&/'g test.txt
    • (.*)表示一整行

sed裏面的p 是打印, g 是全局替換 d 是刪除 -n 參數是要和 p 一塊兒使用htm

awk練習題

  • 1.用awk 打印整個test.txt (如下操做都是用awk工具實現,針對test.txt)
sed '{print $0}' test.txt

sed -F ':' '{print $0}' test.txt
    • -F 參數,做用是指定分隔符,如果不加-F 指定,則會以空格或者tab爲分隔符
  • 2.查找全部包含 ‘bash’ 的行

awk '/bash/' test.txt

awk -F ':' '$0 ~ /bash/' test.txt
  • 3.用 ‘:’ 做爲分隔符,查找第三段等於0的行
awk -F ':' '$3=="0"' test.txt
  • 4.用 ‘:’ 做爲分隔符,查找第一段爲 ‘root’ 的行,並把該段的 ‘root’ 換成 ‘lll’ (能夠連同sed一塊兒使用)
[root@localhost ~]# awk -F ':' '$1=="root"' test.txt |sed 's/root/lll/'
lll:x:0:0:root:/root:/bin/bash
  • 5.用 ‘:’ 做爲分隔符,打印最後一段
awk -F ':' '{print $NR}' test.txt
  • 6.打印行數大於20的全部行
[root@localhost ~]# awk -F ':' 'NR>20 {print $0}' test.txt
  • 7.用 ‘:’ 做爲分隔符,打印全部第三段小於第四段的行
awk -F ':' '$3<$4 {print $0}' test.txt
  • 8.用 ‘:’ 做爲分隔符,打印第一段以及最後一段,而且中間用 ‘@’ 鏈接 (例如,第一行應該是這樣的形式 'root@/bin/bash‘ )
awk -F ':' '{print $1"@"$NF}' test.txt
  • 9.用 ‘:’ 做爲分隔符,把整個文檔的第四段相加,求和
awk -F ':' '{if(sum+=$4)}; END {print sum}' test.txt
相關文章
相關標籤/搜索