awk linux命令_sed AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。 之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。 學習具體使用前,先來看下 aw ...
awk
AWK 是一種處理文本文件的語言,是一個強大的文本分析工具。
之所以叫 AWK 是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元。
學習具體使用前,先來看下 awk 能幹些什麼事情:
1. 能夠將給定的文本內容,按照我們期望的格式輸出顯示,列印成報表。
2. 分析處理系統日誌,快速地分析挖掘我們關心的數據,並生成統計信息;
3. 方便地用來統計數據,比如網站的訪問量,訪問的 IP 量等;
4. 通過各種工具的組合,快速地彙總分析系統的運行信息,讓你對系統的運行瞭如指掌;
5. 強大的腳本語言表達能力,支持迴圈、條件、數組等語法,助你分析更加複雜的數據;
……
當然 awk 不僅能做這些事情,當你將它的用法融匯貫通時,可以隨心所欲的按照你的意願,來進行高效的數據分析和統計。
不過我們需要知道,awk 不是萬能的,它比較擅長處理格式化的文本,比如 日誌、csv 格式數據等;
awk和sed的區別
sed的核心是正則,對於sed, 基本的兩個概念是匹配和行為。
- 匹配是通過區域選擇加上正則表達式實現,比如“3到6行以This開頭的”
- 行為是增刪改查。可以在某個位置新增或刪除一行,可以通過正則表達式進行變數替換,可以顯示滿足某些條件的行。配合shell的批處理就會很強大, 比如我想把所有文件的開頭添加一個註釋,比如我想把所有文件的某一個變數進行替換,比如我想把所有文件滿足某些條件的行進行合併和拆分。
- 同時,sed提供了一個保持空間(hold space)可以實現逆序輸出等操作。
- 另外,sed的用法非常靈活,你可以將匹配和行為進行不同的嵌套,舉個複雜的例子“將第某行到某行之間的滿足A條件的裡面滿足B條件的行進行C操作和D操作並且將E條件的行進行F操作”這樣的靈活組合方式怕是也只有sed了
awk,經常用於格式化輸出,也就是將數據按照我們想要的方式來顯示,並且可以做一些基本的統計工作。
- 它的運作模式是“預處理+逐行處理+最終處理”。一般我們只用“逐行處理”比如對於滿足條件的某些行,我們列印某某列。通過指定分隔符,我們很容易的對列進行操作。
- 預處理來定義變數,逐行處理來修改變數,最終處理來列印變數。
awk的使用
awk 'BEGIN{ commands } /pattern/ {commands} END{ commands }'
1、BEGIN{ commands }開始塊就是在程式啟動的時候執行的代碼部分,並且它在整個過程中只執行一次。一般情況下,我們可以在開始塊中初始化一些變數。
註意:開始塊部分是可選的,你的程式可以沒有開始塊部分。
2、/pattern/ {commands}pattern 部分匹配該行內容成功後,才會執行commands 的內容。
3 END{ commands }結束塊是在程式結束時執行的代碼。
註意:結束塊部分也是可選的
awk的語法
awk [選項參數] 'script' var=value file(s)
或
awk [選項參數] -f scriptfile var=value file(s)
選項 | |
---|---|
-F fs or --field-separator fs | 指定輸入文件折分隔符,fs是一個字元串或者是一個正則表達式,如-F:。 |
-v var=value or --asign var=value | -va=1 賦值一個用戶定義變數a的值為1 |
-f | -f scripfile ,從腳本文件中讀取awk命令 |
-mf nnn and -mr nnn | 對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。 |
-W compact or --compat, -W traditional or --traditional | 在相容模式下運行awk。所以gawk的行為和標準的awk完全一樣,所有的awk擴展都被忽略。 |
-W copyleft or --copyleft, -W copyright or --copyright | 列印簡短的版權信息。 |
-W help or --help, -W usage or --usage | 列印全部awk選項和每個選項的簡短說明。 |
-W lint or --lint | 列印不能向傳統unix平臺移植的結構的警告。 |
-W source program-text or --source program-text | 使用program-text作為源代碼,可與-f命令混用。 |
awk常用變數
變數 | 描述 |
---|---|
$n | $1當前記錄的第1個欄位的內容。和sed中的$1不同,sed表示第一個參數 |
$0 | 整行數據的內容 |
FS | 欄位分隔符(預設是空格) |
OFS | 輸出欄位的分隔符(預設是空格) |
RS | 行分隔符(預設以\n作為一行的結尾),單行分割成多行用到 |
NR | 行號,從1開始,多文件時候也是連續接著計數 |
FNR | 各文件分別計數的行號,多文件的時候會和NR不同,它會重新計數 |
NF | 一行中欄位數量,最後一個欄位內容可以用$NF 取出 |
ARGC | 命令行參數的數目 |
ARGV | 包含命令行參數的數組,第一個參數是命令awk |
awk格式化
字元 | 功能 |
---|---|
%d | 十進位有整數符號 |
%u | 十進位無整數符號 |
%f | 浮點數 |
%s | 字元串 |
%c | 單個字元 |
%p | 指針的值 |
%e | 指數形式的浮點數 |
%x,%X | 無符號以十六進位表示的整數 |
%0 | 無符號以八進位表示的整數 |
%g | 自動選擇合適的表示法 |
\n | 換行 |
\f | 清屏並換頁 |
\t | Tab符號 |
\xhh | 表示一個ASCII碼用16進表示,其中hh是1到2個16進位數 |
\r | 回車 |
示例
awk '{[pattern] action}' {filenames} # 行匹配語句 awk '' 只能用單引號
awk [選項] '匹配規則和處理規則 ' [處理文本路徑]
標準輸出 | awk [選項] '匹配規則和處理規則 '
BEGIN{} : BEGIN是在awk處理文本之前運行
// : 使用的匹配規則
{} :迴圈(每次只處理一行數據)
END{} :當所有的處理全部執行完畢之後,執行END中的相關操作
-
awk -F: '{print $1}' /etc/passwd
[root@localhost Honeypot-deploy-steps] awk -F: '{print $1}' /etc/passwd root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix tss postgres
-
awk -F: '$3>50{print $0}' /etc/passwd 輸出uid大於50的行
[root@localhost] awk -F: '$3>50{print $0}' /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
-F[]:指明輸入欄位分隔符; 不使用-F時預設以空格為欄位分隔符
[root@localhost Honeypot-deploy-steps] awk '{print $1,$3}' /etc/passwd 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 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt ....
-
FS
[root@localhost Honeypot-deploy-steps] awk -v FS=":" '{print $1,$3}' /etc/passwd 輸入時的欄位分隔符 root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192
-
RS
awk -v RS=" " '{print $0}' /etc/passwd
-
NF
[root@localhost Honeypot-deploy-steps] awk '{print NF}' /etc/passwd 輸出欄位個數 1 1 1 1 1 1 1 1 1 1 1 2 1 3 3 3 2 1 11 2
[root@localhost Honeypot-deploy-steps] awk '{print $NF}' /etc/passwd 輸出最後一個欄位 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 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 User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin Management:/:/sbin/nologin bus:/:/sbin/nologin polkitd:/:/sbin/nologin SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin daemon:/dev/null:/sbin/nologin Server:/var/lib/pgsql:/bin/bash
[root@localhost Honeypot-deploy-steps] awk -F: 'NR > 7 && NR < 14{print NR,$0}' /etc/passwd 輸出第7行之後的內容且第14行之前的內容輸出出來,包含行號 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10 operator:x:11:0:operator:/root:/sbin/nologin 11 games:x:12:100:games:/usr/games:/sbin/nologin 12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 13 nobody:x:99:99:Nobody:/:/sbin/nologin
-
FNR:行數,各文件分別計數
[root@localhost Honeypot-deploy-steps] awk '{print FNR}' /etc/passwd /etc/issue 1 2 3 4 5 6 7 8 9 1 2 3 [root@localhost Honeypot-deploy-steps]# awk '{print FNR,$0}' /etc/passwd /etc/issue 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 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/sbin/halt 9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 1 \S 2 Kernel \r on an \m 3
-
FILENAME:當前文件名;
[root@localhost Honeypot-deploy-steps] awk '{print FILENAME,$0}' /etc/passwd /etc/issue /etc/passwd root:x:0:0:root:/root:/bin/bash /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync /etc/passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin /etc/passwd operator:x:11:0:operator:/root:/sbin/nologin /etc/passwd games:x:12:100:games:/usr/games:/sbin/nologin /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin /etc/passwd systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin /etc/passwd dbus:x:81:81:System message bus:/:/sbin/nologin /etc/passwd polkitd:x:999:998:User for polkitd:/:/sbin/nologin /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin /etc/passwd tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin /etc/passwd postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash /etc/issue \S /etc/issue Kernel \r on an \m /etc/issue
-
-v
[root@localhost Honeypot-deploy-steps] awk '{file="passwd";print file,$1}' /etc/passwd 兩種方式是一樣的 passwd root:x:0:0:root:/root:/bin/bash passwd bin:x:1:1:bin:/bin:/sbin/nologin passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin passwd adm:x:3:4:adm:/var/adm:/sbin/nologin passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [root@localhost Honeypot-deploy-steps] awk -v file="passwd" '{print file,$1}' /etc/passwd passwd root:x:0:0:root:/root:/bin/bash passwd bin:x:1:1:bin:/bin:/sbin/nologin passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin passwd adm:x:3:4:adm:/var/adm:/sbin/nologin passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
-
模式匹配. 讓$1匹配模式/root/
[root@localhost Honeypot-deploy-steps] awk -F: '$1~/root/{print $7}' /etc/passwd /bin/bash
-
條件表達式
[root@localhost Honeypot-deploy-steps] awk -F: '{$3>=500?usertype="common user":usertype="sysuser or admin";printf "%20s:%-s\n",$1,usertype}' /etc/passwd root:sysuser or admin bin:sysuser or admin daemon:sysuser or admin adm:sysuser or admin lp:sysuser or admin sync:sysuser or admin shutdown:sysuser or admin halt:sysuser or admin mail:sysuser or admin operator:sysuser or admin games:sysuser or admin ftp:sysuser or admin nobody:sysuser or admin systemd-network:sysuser or admin dbus:sysuser or admin polkitd:common user sshd:sysuser or admin postfix:sysuser or admin tss:sysuser or admin postgres:sysuser or admin
-
通過管道符操作
[root@localhost Honeypot-deploy-steps] cat -n /etc/passwd | awk -F: '{print $1}' 1 root 2 bin 3 daemon 4 adm 5 lp 6 sync 7 shutdown 8 halt 9 mail 10 operator 11 games 12 ftp 13 nobody 14 systemd-network 15 dbus 16 polkitd 17 sshd 18 postfix 19 tss 20 postgres
-
格式化輸出
統計第一列字元的最大個數
[root@localhost Honeypot-deploy-steps] awk -F: 'BEGIN{num=0}{if(length($1)>num){num=length($1)}}END{print num}' /etc/passwd 15
要求輸出第1列和最後一列,排版整齊
[root@localhost Honeypot-deploy-steps] awk -F: '{printf "%-15s %s\n",$1,$NF}' /etc/passwd root /bin/bash bin /sbin/nologin daemon /sbin/nologin adm /sbin/nologin lp /sbin/nologin
在前7行前加7, 前14行前加14,其他原樣輸出
-
本文來自博客園,作者:ivanlee717,轉載請註明原文鏈接:https://www.cnblogs.com/ivanlee717/p/16292056.html