awk(分析&處理)
awk是乙個資料處理工具,相比於sed常常作用於一整行的處理,awk則比較傾向於將一行分成數個」字段「來處理。
通常執行模式:
awk ' 條件型別1 條件型別2...『 filename
屬性說明
$0當前記錄(作為單個變數)
$1~$n
當前記錄的第n個字段,欄位間由fs分隔
fs輸入字段分隔符 預設是空格
nf當前記錄中的字段個數,就是有多少列
nr已經讀出的記錄數,就是行號,從1開始
rs輸入的記錄他隔符默 認為換行符
ofs輸出字段分隔符 預設也是空格
ors輸出的記錄分隔符,預設為換行符
argc
命令列引數個數
argv
命令列引數陣列
filename
當前輸入檔案的名字
ignorecase
如果為真,則進行忽略大小寫的匹配
argind
當前被處理檔案的argv標誌符
convfmt
數字轉換格式 %.6g
environ
unix環境變數
errno
unix系統錯誤訊息
fieldwidths
輸入字段寬度的空白分隔字串
fnr當前記錄數
ofmt
數字的輸出格式(預設值是%.6g)
rstart
被匹配函式匹配的字串首
rlength
被匹配函式匹配的字串長度
subsep
陣列下標分隔符(預設值是\034)
以下操作的資料**為/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
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:ftp user:/var/ftp:/sbin/nologin
...........
[root@entel2 ~]# awk '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
/^root/ 為選擇表示式,
^root表示以root開頭
$0
代表整行$1
代表第乙個區域,依此類推
[root@entel2 ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
root /bin/bash
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
x /bin/bash
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash /bin/bash
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
/root /bin/bash
fs為字段分隔符,可以自己設定,預設是空格,因為passwd裡面是」:」分隔,所以需要修改預設分隔符。
nf是字段總數,$0
代表當前行記錄,$1-$n
是當前行,各個字段對應值。
$nf 最後一列的值。
[root@entel2 ~]# awk 'begin' /etc/passwd
1 root /bin/bash
2 bin /sbin/nologin
3 daemon /sbin/nologin
4 adm /sbin/nologin
5 lp /sbin/nologin
6 sync /bin/sync
7 shutdown /sbin/shutdown
8 halt /sbin/halt
9 mail /sbin/nologin
10 uucp /sbin/nologin
........
指定分隔符為^^
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
1^^root^^/bin/bash
預設字段分隔符:
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
1 root /bin/bash
ofs設定預設字段分隔符
cat /etc/passwd|head -n 5|awk 'begin'
[root@entel2 ~]# cat /etc/passwd|head -n 5|awk 'begin'
1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin^^
ors預設是換行符,這裡修改為:」^^」,所有行之間用」^^」分隔了。
[root@entel2 ~]# awk 'begin}' /etc/passwd
argc=2
0=awk
1=/etc/passwd
[root@entel2 ~]# awk 'begin}' /etc/passwd
num=2
0=awk
1=/etc/passwd
argc得到所有輸入引數個數,argv獲得輸入引數內容,是乙個陣列。
[root@entel2 ~]# awk 'begin/^root/' /etc/passwd
/etc/passwd
可見 第一行並沒有列印出 /etc/passwd
filename,$0-$n,nf 不能使用在begin中,begin中不能獲得任何與檔案記錄操作的變數。
[root@entel2 ~]# awk 'begin' /etc/passwd
.:/oracle/oracle11/product/112/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@entel2 ~]# awk 'begin' /etc/passwd
0.667 123.111
預設的[root@entel2 ~]# awk 'begin' /etc/passwd
0.666667 123.111111
ofmt預設輸出格式是:%.6g 保留六位小數,這裡修改ofmt會修改預設資料輸出格式。
[root@entel2 ~]# echo 20160922231258 | awk 'begin'
2016-09-22 23:12:58
fieldwidths其格式為空格分隔的一串數字,用以對記錄進行域的分隔,fieldwidths=」4 2 2 2 2 2」就表示$1
寬度是4,$2
是2,$3
是2 …. 。這個時候會忽略:fs分隔符。
[root@entel2 ~]# awk 'begin'
11 11 4
[root@entel2 ~]# awk 'begin'
0 0 -1
rstart 被匹配正規表示式首位置,rlength 匹配字元長度,沒有找到為-1. Linux awk處理變數
我們在使用awk的大部分場景,是對檔案的處理,但有時也會用它對變數進行處理。awk有兩種方式可以實現對變數的處理 1 oracle master test cat test.sh bin bash a abc,123 a1 echo a awk f a2 echo a awk f echo 拆分後第...
mysql內建變數 MySQL常用內建變數
mysql用很多常用的內建變數,掌握這些內建變數後對於我們快速獲取當前mysql的配置有很大幫助,下面就來列舉幾個常用的變數。檢視當前mysql版本號資訊。show variables like version mariadb none show variables like version var...
nginx內建全域性變數及含義
名稱 版本 說明 變數列表 於檔案 ngx http variables args 1.0.8 請求中的引數 binary remote addr 1.0.8 遠端位址的二進位制表示 body bytes sent 1.0.8 已傳送的訊息體位元組數 content length 1.0.8 htt...