国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統 - Linux - awk:一個強大的文本分析工具

awk:一個強大的文本分析工具

2021-03-09 00:56Linux中國阿銘 Linux

awk 是流式編輯器,針對文檔中的行來操作,一行一行地執行。awk 可以非常方便、高效地操作文檔以及字符,從而實現我們想要的格式。它的功能非常強大,我在 shell 腳本中經常使用它來處理字符串。下面介紹幾個在工作中使用

awk:一個強大的文本分析工具

awk 是流式編輯器,針對文檔中的行來操作,一行一行地執行。awk 可以非常方便、高效地操作文檔以及字符,從而實現我們想要的格式。它的功能非常強大,我在 shell 腳本中經常使用它來處理字符串。下面介紹幾個在工作中使用 awk 較頻繁的用法。

1.   截取文檔中的某個段

 

示例命令如下:

  1. # head -n2 test.txt |awk -F ':' '{print $1}'
  2. root
  3. bin

本例中,-F 選項的作用是指定分隔符。如果不加 -F 選項,則以空格或者 tab 為分隔符。print 為打印的動作,用來打印某個字段。$1 為第 1 個字段,$2 為第 2 個字段,以此類推。但 $0 比較特殊,它表示整行:

  1. # head -n2 test.txt |awk -F':' '{print $0}'
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin

注意 awk 的格式,-F 后面緊跟單引號,單引號里面為分隔符。print 的動作要用 {} 括起來,否則會報錯。print 還可以打印自定義的內容,但是自定義的內容要用雙引號括起來,如下所示:

  1. # head -n2 test.txt |awk -F ':' '{print $1"#"$2"#"$3"#"$4}'
  2. root#x#0#0
  3. bin#x#1#1

2. 匹配字符或者字符串

 

在文檔中過濾出包含指定字符串的行,示例命令如下:

  1. # awk '/oo/' test.txt
  2. root:x:0:0:root:/root:/bin/bash
  3. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  4. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  5. operator:x:11:0:operator:/root:/sbin/nologin
  6. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  7. setroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin

這跟 sed 的用法類似,能實現 grep 的功能,但沒有顏色顯示,肯定沒有 grep 用起來方便。不過 awk 還有比 sed 更強大的匹配,如下所示:

  1. # awk -F ':' '$1 ~/oo/' test.txt
  2. root:x:0:0:root:/root:/bin/bash
  3. setroubleshoot:x:992:990::/var/lib/setroubleshoot:/sbin/nologin

它可以讓某個段去匹配,這里的~就是匹配的意思。

此外,awk 還可以多次匹配,如下所示:

  1. # awk -F ':' '/root/ {print $1,$3} /test/ {print $1,$3}' test.txt
  2. root 0
  3. operator 11
  4. test 1006

本例中,awk 匹配完 root,再匹配 test,并且只打印所匹配的段。

3. 條件操作符

 

有時候,在匹配字符的同時要給出限定條件,比如第 3 段為 0 。示例命令如下:

  1. # awk -F ':' '$3=="0"' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash

awk 中,我們可以用邏輯符號進行判斷,比如 == 就是等于,也可以理解為精確匹配。另外,還有 >、>=、<<=、!=等。值得注意的是,在和數字比較時,若把要比較的數字用雙引號引起來,那么 awk 不會將其認為是數字,而會認為是字符,不加雙引號就會認為是數字。示例命令如下:

  1. # awk -F ':' '$3>="500"' /etc/passwd |head -n 5
  2. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  3. halt:x:7:0:halt:/sbin:/sbin/halt
  4. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  5. nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
  6. dbus:x:81:81:System message bus:/:/sbin/nologin

本例中,阿銘本想把 uid 大于等于 500 的行打印出來,但是結果并不理想。這是因為 awk 把所有的數字都當作字符了,就跟上一章中提到的 sort 排序原理一樣。但是,如果不加雙引號,就得到了想要的結果:

  1. # awk -F ':' '$3>=500' /etc/passwd|head -n 5
  2. nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
  3. systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
  4. polkitd:x:998:996:User for polkitd:/:/sbin/nologin
  5. geoclue:x:997:995:User for geoclue:/var/lib/geoclue:/sbin/nologin
  6. unbound:x:996:991:Unbound DNS resolver:/etc/unbound:/sbin/nologin
  1. # awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. sync:x:5:0:sync:/sbin:/bin/sync
  4. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  5. halt:x:7:0:halt:/sbin:/sbin/halt
  6. aminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash

上例中,!= 表示不匹配,它除了針對某一個段的字符進行邏輯比較外,還可以在兩個段之間進行邏輯比較。如下所示:

  1. # awk -F ':' '$3<$4' /etc/passwd
  2. adm:x:3:4:adm:/var/adm:/sbin/nologin
  3. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  4. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  5. games:x:12:100:games:/usr/games:/sbin/nologin
  6. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

另外,還可以使用 && 和 ||,它們分別表示“并且”和“或者”。&& 的用法如下:

  1. # awk -F ':' '$3>"5" && $3<"7"' /etc/passwd
  2. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  3. nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
  4. tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

|| 的用法如下:

  1. # awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
  4. aminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash

4.  awk 的內置變量

 

awk 常用的變量有 OFS、NFNROFS-F 選項有類似的功能,也是用來定義分隔符的,但是它是在輸出的時候定義的。NF 表示用分隔符分隔后一共有多少段。NR 表示行號。

OFS 的用法示例如下:

  1. # head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}'
  2. root#0#0
  3. bin#1#1
  4. daemon#2#2
  5. adm#3#4
  6. lp#4#7

還有更高級一些的用法:

  1. # awk -F ':' '{OFS="#"} {if ($3>=1000) {print $1,$2,$3,$4}}' /etc/passwd
  2. nobody#x#65534#65534
  3. aminglinux#x#1000#1000

變量 NF 的具體用法如下:

  1. # head -n3 /etc/passwd | awk -F ':' '{print NF}'
  2. 7
  3. 7
  4. 7 
  1. # head -n3 /etc/passwd | awk -F ':' '{print $NF}'
  2. /bin/bash
  3. /sbin/nologin
  4. /sbin/nologin

這里 NF 是多少段,$NF 是最后一段的值。變量 NR 的具體用法如下:

  1. # head -n3 /etc/passwd | awk -F ':' '{print NR}'
  2. 1
  3. 2
  4. 3

我們還可以使用 NR 作為判斷條件,如下所示:

  1. # awk 'NR>40' /etc/passwd
  2. insights:x:978:976:Red Hat Insights:/var/lib/insights:/sbin/nologin
  3. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  4. avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
  5. tcpdump:x:72:72::/:/sbin/nologin
  6. aminglinux:x:1000:1000:aminglinux:/home/aminglinux:/bin/bash

NR 也可以配合段匹配一起使用,如下所示:

  1. # awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash

5.  awk 中的數學運算

 

awk 可以更改段值,示例命令如下:

  1. # head -n 3 /etc/passwd |awk -F ':' '$1="root"'
  2. root x 0 0 root /root /bin/bash
  3. root x 1 1 bin /bin /sbin/nologin
  4. root x 2 2 daemon /sbin /sbin/nologin

awk 也可以對各個段的值進行數學運算,示例命令如下:

  1. # head -n2 /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  1. # head -n2 /etc/passwd |awk -F ':' '{$7=$3+$4}'
  1. # head -n2 /etc/passwd |awk -F ':' '{$7=$3+$4; print $0}'
  2. root x 0 0 root /root 0
  3. bin x 1 1 bin /bin 2

awk 還可以計算某個段的總和,示例命令如下:

  1. # awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd
  2. 84699

這里的 ENDawk 特有的語法,表示所有的行都已經執行。如下所示:

  1. # awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash

其實 awk 可以寫成一個腳本文件,而且有它特有的語法。在 awk 中使用 if 判斷、for 循環都可以,只是在日常管理工作中,使用那么復雜的語句并不常見。

最后,我們再附上常見正則字符的解釋。

  • . 表示任意一個字符,比如空格、特殊符號等。
  • * 表示 * 前面的字符有 0 個或多個,比如 a* 那就是 0 個 a 或者多個 a
  • .* 表示任意個任意字符,就是貪婪匹配了。
  • + 就是 + 前面的字符有 1 個或者多個,如 a+ 就是 a、aaaaa……
  • ? 就是 ? 前面的字符有 1 個或者 0 個。
  • { } 里面是一個范圍,如 {1,5} 就是 { } 前面的字符有 1~5 個。
  • | 表示或者,如 a|b 就是 a 或者 b。
  • [ ] 表示這里面的任意一個字符,如 [abc] 就是 a 或者 b 或者 c。此外,也可以用范圍 [0-9] 表示任意一個數字,用 [a-z] 表示任意一個小寫字母。
  • ^ 表示開頭。
  • $ 表示結尾。

本篇文章節選自《跟阿銘學 Linux(第4版)》一書。

原文地址:https://linux.cn/article-13177-1.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 中文字幕在线观看 | 国产一区视频在线 | 亚洲视频在线看 | 久久久久国产一区二区三区四区 | 久久精品在线视频 | 亚洲久草 | 亚洲成人免费 | 色综合视频网 | 久久亚洲一区二区 | 亚洲午夜视频在线观看 | 久久久精品综合 | 26uuu成人免费毛片 | 一区二区在线免费观看 | 亚洲成人福利网 | 蜜桃传媒一区二区 | 国产美女视频自拍 | 久久99一区二区 | 中文字幕日本一区二区 | 91麻豆精品国产91久久久更新资源速度超快 | 免费黄色在线看 | 欧美激情久久久 | 精品视频在线观看 | 五月婷婷激情网 | 亚州ava| 亚洲人成网站999久久久综合 | 欧美精品区 | 精品国内 | 欧美日本在线 | 久久精品影视 | 91在线视频导航 | 自拍亚洲欧美 | 97在线观看视频 | 中文字幕成人 | 国产精品一区二区在线观看 | 成人免费一区二区三区视频网站 | 欧美三级视频 | 国产亚洲一区二区精品 | 五月婷婷激情 | 欧洲亚洲一区 | 欧美综合激情 | 亚洲精品综合 |