Linux-awk及内置变量
概述
awk(分析&處理)
awk是一個數(shù)據(jù)處理工具,相比于sed常常作用于一整行的處理,awk則比較傾向于將一行分成數(shù)個”字段“來處理。
通常運行模式:
awk ' 條件類型1{動作1} 條件類型2{動作2}...‘ filenameawk ' BEGIN{ print "start" } pattern { commands } END{ print "end" } fileawk 內(nèi)置變量使用
內(nèi)置變量表
| $0 | 當前記錄(作為單個變量) |
| $1~$n | 當前記錄的第n個字段,字段間由FS分隔 |
| FS | 輸入字段分隔符 默認是空格 |
| NF | 當前記錄中的字段個數(shù),就是有多少列 |
| NR | 已經(jīng)讀出的記錄數(shù),就是行號,從1開始 |
| RS | 輸入的記錄他隔符默 認為換行符 |
| OFS | 輸出字段分隔符 默認也是空格 |
| ORS | 輸出的記錄分隔符,默認為換行符 |
| ARGC | 命令行參數(shù)個數(shù) |
| ARGV | 命令行參數(shù)數(shù)組 |
| FILENAME | 當前輸入文件的名字 |
| IGNORECASE | 如果為真,則進行忽略大小寫的匹配 |
| ARGIND | 當前被處理文件的ARGV標志符 |
| CONVFMT | 數(shù)字轉(zhuǎn)換格式 %.6g |
| ENVIRON | UNIX環(huán)境變量 |
| ERRNO | UNIX系統(tǒng)錯誤消息 |
| FIELDWIDTHS | 輸入字段寬度的空白分隔字符串 |
| FNR | 當前記錄數(shù) |
| OFMT | 數(shù)字的輸出格式(默認值是%.6g) |
| RSTART | 被匹配函數(shù)匹配的字符串首 |
| RLENGTH | 被匹配函數(shù)匹配的字符串長度 |
| SUBSEP | 數(shù)組下標分隔符(默認值是\034) |
栗子
以下操作的數(shù)據(jù)來源為/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開頭的那一行
[root@entel2 ~]# awk '/^root/{print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash/^root/ 為選擇表達式,
^root表示以root開頭
$0 代表整行 $1代表第一個區(qū)域,依此類推
設置字段分隔符號(FS使用方法)
[root@entel2 ~]# head -1 /etc/passwd root:x:0:0:root:/root:/bin/bash[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $1,$NF}' /etc/passwd root /bin/bash[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $2,$NF}' /etc/passwd x /bin/bash[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $0,$NF}' /etc/passwd root:x:0:0:root:/root:/bin/bash /bin/bash[root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print $6,$NF}' /etc/passwd /root /bin/bashFS為字段分隔符,可以自己設置,默認是空格,因為passwd里面是”:”分隔,所以需要修改默認分隔符。
NF是字段總數(shù),$0代表當前行記錄,$1-$n是當前行,各個字段對應值。
$NF 最后一列的值。
記錄條數(shù)(NR,FNR使用方法)
[root@entel2 ~]# awk 'BEGIN{FS=":"}{print NR,$1,$NF}' /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 ........設置輸出字段分隔符(OFS使用方法)
指定分隔符為^^ [root@entel2 ~]# awk 'BEGIN{FS=":";OFS="^^"}/^root/{print FNR,$1,$NF}' /etc/passwd 1^^root^^/bin/bash默認字段分隔符: [root@entel2 ~]# awk 'BEGIN{FS=":"}/^root/{print FNR,$1,$NF}' /etc/passwd 1 root /bin/bashOFS設置默認字段分隔符
設置輸出行記錄分隔符(ORS使用方法)
cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' [root@entel2 ~]# cat /etc/passwd|head -n 5|awk 'BEGIN{FS=":";ORS="^^"}{print FNR,$1,$NF}' 1 root /bin/bash^^2 bin /sbin/nologin^^3 daemon /sbin/nologin^^4 adm /sbin/nologin^^5 lp /sbin/nologin^^ORS默認是換行符,這里修改為:”^^”,所有行之間用”^^”分隔了。
輸入?yún)?shù)獲取(ARGC ,ARGV使用)
[root@entel2 ~]# awk 'BEGIN{FS=":";print "ARGC="ARGC;for(k in ARGV) {print k"="ARGV[k]; }}' /etc/passwd ARGC=2 0=awk 1=/etc/passwd[root@entel2 ~]# awk 'BEGIN{FS=":";print "NUM="ARGC;for(k in ARGV){print k"="ARGV[k];}}' /etc/passwd NUM=2 0=awk 1=/etc/passwdARGC得到所有輸入?yún)?shù)個數(shù),ARGV獲得輸入?yún)?shù)內(nèi)容,是一個數(shù)組。
獲得傳入的文件名(FILENAME使用)
[root@entel2 ~]# awk 'BEGIN{FS=":";print FILENAME}/^root/{print FILENAME}' /etc/passwd/etc/passwd可見 第一行并沒有打印出 /etc/passwd
FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能獲得任何與文件記錄操作的變量。獲得linux環(huán)境變量(ENVIRON使用)
[root@entel2 ~]# awk 'BEGIN{print ENVIRON["PATH"];}' /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輸出數(shù)據(jù)格式設置:(OFMT使用)
[root@entel2 ~]# awk 'BEGIN{OFMT="%.3f";print 2/3,123.11111111;}' /etc/passwd 0.667 123.111默認的 [root@entel2 ~]# awk 'BEGIN{OFMT="%.6f";print 2/3,123.11111111;}' /etc/passwd 0.666667 123.111111OFMT默認輸出格式是:%.6g 保留六位小數(shù),這里修改OFMT會修改默認數(shù)據(jù)輸出格式。
按寬度指定分隔符(FIELDWIDTHS使用)
[root@entel2 ~]# echo 20160922231258 | awk 'BEGIN{FIELDWIDTHS="4 2 2 2 2 2"}{print $1"-"$2"-"$3,$4":"$5":"$6}' 2016-09-22 23:12:58FIELDWIDTHS其格式為空格分隔的一串數(shù)字,用以對記錄進行域的分隔,FIELDWIDTHS=”4 2 2 2 2 2”就表示$1寬度是4,$2是2,$3是2 …. 。這個時候會忽略:FS分隔符。
RSTART RLENGTH使用
[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }' 11 11 4[root@entel2 ~]# awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }' 0 0 -1RSTART 被匹配正則表達式首位置,RLENGTH 匹配字符長度,沒有找到為-1.
總結(jié)
以上是生活随笔為你收集整理的Linux-awk及内置变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 命令行参数
- 下一篇: Oracle实例迁移_真实场景实操