Linux awk 命令詳解
AWK是一種處理文字檔案的語言,是一個強大的文字分析工具。之所以叫AWK是因為其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字元
awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。
使用方法 : awk '{pattern + action}' {filenames}
awk內建變數:
$n 當前記錄的第n個欄位,欄位間由FS分隔
$0 完整的輸入記錄
ARGC 命令列引數的數目
ARGIND 命令列中當前檔案的位置(從0開始算)
ARGV 包含命令列引數的陣列
CONVFMT 數字轉換格式(預設值為%.6g)ENVIRON環境變數關聯陣列
ERRNO 最後一個系統錯誤的描述
FIELDWIDTHS 欄位寬度列表(用空格鍵分隔)
FILENAME 當前檔名
FNR 各檔案分別計數的行號
FS 設定輸入域分隔符,等價於命令列 -F選項
IGNORECASE 如果為真,則進行忽略大小寫的匹配
NF 一條記錄的欄位的數目
NR 已經讀出的記錄數,就是行號,從1開始
OFMT 數字的輸出格式(預設值是%.6g)
OFS 輸出記錄分隔符(輸出換行符),輸出時用指定的符號代替換行符
ORS 輸出記錄分隔符(預設值是一個換行符)
RLENGTH 由match函式所匹配的字串的長度
RS 記錄分隔符(預設是一個換行符)
RSTART 由match函式所匹配的字串的第一個位置
SUBSEP 陣列下標分隔符(預設值是/034)
$NF是number finally,表示最後一列的資訊,跟變數NF是有區別的,變數NF統計的是每行列的總數
format格式:
%c:顯示單個字元
%d,%i:十進位制整數
%e,%E:科學計數法顯示數值
%f:顯示浮點數
%g,%G:以科學計數法的格式或浮點數的格式顯示數值
%s:顯示字串
%u:無符號整數
%%:顯示%自身
修飾符:
N:顯示寬度,N為數字
-:左對齊,預設為右對齊
+:顯示數值符號
\t 製表符
\n 換行符
~ 匹配,與==相比不是精確比較
!~ 不匹配,不精確比較
== 等於,必須全部相等,精確比較
!= 不等於,精確比較
&& 邏輯與
|| 邏輯或
+ 匹配時表示1個或1個以上
/[0-9][0-9]+/ 兩個或兩個以上數字
/[0-9][0-9]*/ 一個或一個以上數字
awk 列輸出:
1.搜尋/etc/passwd有root關鍵字的所有行
[root@127-0-0-1 scripts]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
2.搜尋/etc/passwd有root關鍵字的所有行,並輸出shell列
[root@127-0-0-1 scripts]# awk -F ":" '/root/ {print $7}' /etc/passwd
/bin/bash
/sbin/nologin
3.統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容
[root@127-0-0-1 scripts]# awk -F ":" '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
filename:/etc/passwd,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
filename:/etc/passwd,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
filename:/etc/passwd,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
filename:/etc/passwd,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
filename:/etc/passwd,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt
filename:/etc/passwd,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
filename:/etc/passwd,linenumber:10,columns:7,linecontent:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
filename:/etc/passwd,linenumber:11,columns:7,linecontent:operator:x:11:0:operator:/root:/sbin/nologin
filename:/etc/passwd,linenumber:12,columns:7,linecontent:games:x:12:100:games:/usr/games:/sbin/nologin
filename:/etc/passwd,linenumber:13,columns:7,linecontent:gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
filename:/etc/passwd,linenumber:14,columns:7,linecontent:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
filename:/etc/passwd,linenumber:15,columns:7,linecontent:nobody:x:99:99:Nobody:/:/sbin/nologin
filename:/etc/passwd,linenumber:16,columns:7,linecontent:dbus:x:81:81:System message bus:/:/sbin/nologin
filename:/etc/passwd,linenumber:17,columns:7,linecontent:vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
filename:/etc/passwd,linenumber:18,columns:7,linecontent:abrt:x:173:173::/etc/abrt:/sbin/nologin
filename:/etc/passwd,linenumber:19,columns:7,linecontent:saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
filename:/etc/passwd,linenumber:20,columns:7,linecontent:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
filename:/etc/passwd,linenumber:21,columns:7,linecontent:haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
filename:/etc/passwd,linenumber:22,columns:7,linecontent:ntp:x:38:38::/etc/ntp:/sbin/nologin
filename:/etc/passwd,linenumber:23,columns:7,linecontent:sshd:x:74:74::/var/empty/sshd:/bin/false
filename:/etc/passwd,linenumber:24,columns:7,linecontent:zabbix:x:498:498:Zabbix Monitoring System:/var/lib/zabbix:/bin/bash
filename:/etc/passwd,linenumber:25,columns:7,linecontent:ntop:x:497:497:ntop:/var/lib/ntop:/sbin/nologin
filename:/etc/passwd,linenumber:26,columns:7,linecontent:tcpdump:x:72:72::/:/sbin/nologin
filename:/etc/passwd,linenumber:27,columns:7,linecontent:dev:x:500:500::/home/dev:/bin/bash
filename:/etc/passwd,linenumber:28,columns:7,linecontent:ops:x:501:501::/home/ops:/bin/bash
filename:/etc/passwd,linenumber:29,columns:7,linecontent:qa:x:502:502::/home/qa:/bin/bash
filename:/etc/passwd,linenumber:30,columns:7,linecontent:bigdata:x:503:503::/home/bigdata:/bin/bash
filename:/etc/passwd,linenumber:31,columns:7,linecontent:test:x:504:504::/home/test:/bin/bash
filename:/etc/passwd,linenumber:32,columns:7,linecontent:autobots:x:505:505::/home/autobots:/bin/bash
filename:/etc/passwd,linenumber:33,columns:7,linecontent:netdata:x:496:496:netdata:/opt/netdata:/sbin/nologin
filename:/etc/passwd,linenumber:34,columns:7,linecontent:mysql:x:506:506:MySQL Server:/home/mysql:/bin/bash
filename:/etc/passwd,linenumber:35,columns:7,linecontent:gluster:x:495:495:GlusterFS daemons:/var/run/gluster:/sbin/nologin
filename:/etc/passwd,linenumber:36,columns:7,linecontent:apache:x:48:48:Apache:/var/www:/sbin/nologin
filename:/etc/passwd,linenumber:37,columns:7,linecontent:mysql-proxy:x:494:494:MySQL-Proxy user:/:/sbin/nologin
4.列印/etc/passwd/的第二行資訊
[root@127-0-0-1 scripts]# awk 'NR==2{print "filename:" FILENAME,$0}' /etc/passwd
filename:/etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
5.獲取第12到30行的第一列的資訊
[root@127-0-0-1 scripts]# awk -F ":" '{if(NR > 12 && NR < 30) print $1}' /etc/passwd
gopher
ftp
nobody
dbus
vcsa
abrt
saslauth
postfix
haldaemon
ntp
sshd
zabbix
ntop
tcpdump
dev
ops
qa
6.多分隔符的使用,多個分隔符利用[]然後在裡面寫分隔符即可
[root@127-0-0-1 scripts]# cat yoon.txt
192.168.1.1:3307
[root@127-0-0-1 scripts]# awk -F '[.:]' '{print $1,$5}' yoon.txt
192 3307
7.新增了BEGIN和END
hello world
[root@127-0-0-1 scripts]# cat long.txt
2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo
[root@127-0-0-1 scripts]# cat long.txt | awk 'BEGIN{print "name,shell"} {print $1,$NF} END {print "hello world"}'
name,shell
2 test
3 awk
This's test
10 orange,apple,mongo
hello world
8.忽略大小寫
[root@127-0-0-1 scripts]# awk 'BEGIN{IGNORECASE=1} /this/' long.txt
2 this is a test
This's a test
9.使用正則,字串匹配
輸出第二列包含 "th",並列印第二列與第四列
[root@127-0-0-1 scripts]# awk '$2 ~ /th/ {print $2,$4}' long.txt
this a
10.輸出第二列不包含 "th",並列印第二列與第四列
[root@127-0-0-1 scripts]# awk '$2 !~ /th/ {print $2,$4}' long.txt
Are like
a
11.匹配包含27為數字開頭的行,如27,277,2777...
awk '/[2][7][7]*/{print $0}' /etc/passwd 匹配包含27為數字開頭的行,如27,277,2777...
12.awk自定義輸出
awk '{print $1 $3}' part01 //$1與$3相連輸出,不分隔
awk '{print $1,$3}' part01 //多了一個逗號,$1與$3使用空格分隔
awk '{print $1 " " $3}' part01 //$1與$3之間手動新增空格分隔
13.awk對欄位數量做判斷的輸出
awk '{print $NF}' part01 //將每行第NF個欄位的值列印出來
awk 'NF==4 {print }' part01 //顯示只有4個欄位的行
awk 'NF>2{print $0}' part01 //顯示每行欄位數量大於2的行
14.awk對行的處理
awk '{print NR,NF,$NF,"\t",$0}' part01 //依次列印行號,欄位數,最後欄位值,製表符,每行內容
awk 'NR==5{print}' part01 //顯示第5行
awk 'NR==5 || NR==6{print}' part01 //顯示第5行和第6行
awk 'NR!=1{print}' part01 //不顯示第一行
15.匹配字元處理
//純字元匹配 !//純字元不匹配 ~//欄位值匹配 !~//欄位值不匹配 ~/a1|a2/欄位值匹配a1或a2
awk '/mail/,/mysql/{print}' /etc/passwd //區間匹配
awk '/[2][7][7]*/{print $0}' /etc/passwd //匹配包含27為數字開頭的行,如27,277,2777...
awk '$1~/mail/{print $1}' /etc/passwd //$1匹配指定內容才顯示
awk '{if($1~/mail/) print $1}' /etc/passwd //與上面相同
awk '$1!~/mail/{print $1}' /etc/passwd //不匹配
16.IF語句,必須用在{}中,且比較內容用()擴起來
awk '{if($1~/mail/) print $1}' /etc/passwd //簡寫
awk '{if($1~/mail/) {print $1}}' /etc/passwd //全寫
awk '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd //if...else...
17.條件表示式 == != > >=
awk '$1=="183.198.46.6"{print $4}' part01
awk '{if($1=="mysql") print $3}' /etc/passwd //與上面相同
awk '$1!="mysql"{print $3}' /etc/passwd //不等於
awk '$3>1000{print $3}' /etc/passwd //大於
awk '$3>=100{print $3}' /etc/passwd //大於等於
awk '$3<1{print $3}' /etc/passwd //小於
awk '$3<=1{print $3}' /etc/passwd //小於等於
18.邏輯運算子 && ||
awk '$1~/183.198.46.6/ && $4~/2015:19:14:40/ {print$7}' part01
awk '$1~/mail/ && $3>8 {print }' part01 //邏輯與,$1匹配mail,並且$3>8
awk '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk '$1~/mail/ || $3>1000 {print }' /etc/passwd //邏輯或
awk '{if($1~/mail/ || $3>1000) print }' /etc/passwd
19.數值運算
awk '$3 > 100' /etc/passwd
awk '$3 > 100 || $3 < 5' /etc/passwd
awk '$3+$4 > 200' /etc/passwd
awk '/mysql|mail/{print $3+10}' /etc/passwd //第三個欄位加10列印
awk '/mysql/{print $3-$4}' /etc/passwd //減法
awk '/mysql/{print $3*$4}' /etc/passwd //求乘積
awk '/MemFree/{print $2/1024}' /proc/meminfo //除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo //取整
20.格式化輸出
awk '{printf "%-8d %-8s %-10s\n",$1,$2,$3}' part01
printf表示格式輸出
%格式化輸出分隔符,-8長度為8個數字,s表示字串型別,列印每行前三個欄位,指定第一個欄位輸出字串型別(長度為8),第二個欄位輸出字串型別(長度為8),第三個欄位輸出字串型別(長度為10)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2685615/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux awk 命令詳解Linux
- linux awk命令詳解Linux
- Linux中awk命令詳解Linux
- [轉]linux awk命令詳解Linux
- linux awk命令詳解 --轉載Linux
- awk命令詳解
- linux系統awk命令使用詳解Linux
- Linux三劍客Awk、Sed、Grep 命令詳解Linux
- Linux 三劍客 Awk、Sed、Grep 命令詳解Linux
- Linux (三劍客之三) awk命令詳解Linux
- linux的awk命令Linux
- Linux三劍客之awk詳解Linux
- Linux:“awk”命令的妙用Linux
- Linux awk 命令 說明Linux
- 5分鐘帶你瞭解Linux awk命令!Linux
- Linux at命令詳解Linux
- awk sed 用法詳解
- 技能篇:awk教程-linux命令Linux
- Linux 三劍客之 awk 實戰詳解教程Linux
- Linux xargs 命令詳解Linux
- Linux sed 命令詳解Linux
- linux top 命令詳解Linux
- Linux diff命令詳解Linux
- Linux chattr命令詳解Linux
- Linux命令top詳解Linux
- Linux screen 命令詳解Linux
- Linux find 命令詳解Linux
- linux top命令詳解Linux
- linux命令詳解:sortLinux
- 【Linux】tcpdump命令詳解LinuxTCP
- linux tail 命令詳解LinuxAI
- Linux more命令詳解Linux
- linux grep命令詳解Linux
- Linux free命令詳解Linux
- Linux PS命令詳解Linux
- Linux date命令詳解Linux
- Linux scp命令詳解Linux
- Linux df命令詳解Linux