Linux awk及內建變數

2021-08-21 13:10:59 字數 4810 閱讀 5320

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...