awk基礎

 

 

 

 

 

 

 

和虛擬機無關,在任何虛擬機上操做均可以的php

[root@centos77 ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.137.77  netmask 255.255.255.0  broadcast 192.168.137.255
        inet6 fe80::5de5:1874:5e74:be1d  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:63:99:29  txqueuelen 1000  (Ethernet)
        RX packets 2088  bytes 230605 (225.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1314  bytes 185011 (180.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

 

 

 

 

一awk介紹

 

 

awk是Linux實際工做中重要強大的工具,至關於一門語言,使得工做駕輕就熟。node

awk由來:是Aho, Weinberger, Kernighan這3我的一塊兒發佈的軟件,取其名字首字母。mysql

awk做用:作報表的報告生成器,格式化文本輸出,用來處理數據和生成報告。linux

處理的數據能夠是一個或多個文件,它是Linux系統最強大的文本處理工具c++

awk的版本:New awk(nawk),GNU awk( gawk)正則表達式

Linux系統默認使用的是基於GNU項目開發出來的gawksql

 

 

[root@centos77 ~]# awk 
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:        GNU long options: (standard)
    -f progfile        --file=progfile
    -F fs            --field-separator=fs
    -v var=val        --assign=var=val
Short options:        GNU long options: (extensions)
    -b            --characters-as-bytes
    -c            --traditional
    -C            --copyright
    -d[file]        --dump-variables[=file]
    -e 'program-text'    --source='program-text'
    -E file            --exec=file
    -g            --gen-pot
    -h            --help
    -L [fatal]        --lint[=fatal]
    -n            --non-decimal-data
    -N            --use-lc-numeric
    -O            --optimize
    -p[file]        --profile[=file]
    -P            --posix
    -r            --re-interval
    -S            --sandbox
    -t            --lint-old
    -V            --version

To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.

gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.

Examples:
    gawk '{ sum += $1 }; END { print sum }' file
    gawk -F: '{ print $1 }' /etc/passwd
[root@centos77 ~]# which   awk 
/usr/bin/awk
[root@centos77 ~]# ll  /usr/bin/awk
lrwxrwxrwx. 1 root root 4 Jan 24 19:05 /usr/bin/awk -> gawk

 

 

 

 

 

 

注意若是學了bash以後學這個就比較快了。由於語言是相通的shell

gawk:模式掃描和處理語言數據庫

GAWK(1)                                                                             Utility Commands                                                                            GAWK(1)

NAME
       gawk - pattern scanning and processing language

 

 

 

 

 

 

 

 

二awk的基本用法

 

 

(一)基本格式

 


awk [options]     ‘program’ var=value file… 
awk [options]    -f    programfile var=value file…apache

注意文件就是參數

awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file ...

awk [參數] 條件(動做)文件

 

注意這裏的模式pattern就至關因而條件。

在awk命令及後面的選項和文件裏,每一個元素之間都至少要有一個空格。

 



   

 

 

基本格式:awk [options] 'program' file…

program由pattern{action statements;..}組成


program、pattern、action:

program左右兩邊一般要加單引號或雙引號

pattern部分決定動做語句什麼時候觸發及觸發事件BEGIN,END
action statements對數據進行處理,放在{}內指明
命令有print, printf,後者功能更強大。

好比字段與字段有多寬,小數點能夠有幾位。

printf也是linux裏面的命令,和echo的選項是類似的。

[root@centos77 ~]# printf
printf: usage: printf [-v var] format [arguments]
[root@centos77 ~]# type  printf
printf is a shell builtin

 

 

 

 

 

 

基本格式:awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file ...
awk [options]   'BEGIN{ action;… }

表示尚未讀取文件就作的事,好比把表頭打出來      

pattern   { action;… }

表示的是對每一行進行處理。

END{  action;… }' file ... 就是把全部的行都讀完了作一下收尾性的工做,好比作統計,彙總等等。

awk 程序一般由:BEGIN語句塊、可以使用模式匹配的通用語句塊、END語句塊3部分組成。

 



 

 

 

 

 

 

(二)分割符、域和記錄


 awk執行時,由分隔符分隔的字段(域)標記$1,$2..$n稱爲域標識。

$0爲全部域,也就是整行。

注意和shell中變量$符含義不一樣,在bash裏面$0表示的程序名和路徑。

文件的每一行稱爲記錄,可是並非只有一行就是記錄。

好比a:bb;ccc:dddd;  這一行裏面a:bb;就是一條記錄了,a:bb是用冒號隔開的,就是兩個字段。

 

省略action,則默認執行 print $0 的操做,也就是把整行打印出來。

 

 

 

 

 

 

 

三awk的工做原理

 

 

文本文件有不少行,awk每次會讀取一行,讀入到awk的內存空間。

處理了一行就會自動讀取下一行。

會把定義的分隔符切割成字段,可使用-F 指明輸入時用到的字段分隔符。

和cut相似,cut  -d:。

切割成字段以後使用$1,$2...表示每一個字段,取其中第幾列就很簡單。

awk具備循環功能是爲了對字段進行輪流處理。

默認狀況下讀取每行,可是能夠設置條件進行過濾,只處理符合條件的行。

 

第一步:執行BEGIN{action;… }語句塊中的語句,沒有讀取文件行以前的操做。


第二步:從文件或標準輸入(stdin)讀取一行,標準輸入會涉及到管道或者命令的執行結果。

 

而後執行pattern{  action;… }語句塊,它逐行掃描文件,

從第一行到最後一行重複這個過程,直到文件所有被讀取完畢。

若是符合pattern的定義就執行裏面的動做。

 

第三步:當讀至輸入流末尾時,執行END{action;…}語句塊。

 


BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,

好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中。


END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,

也是一個可選語句塊。


pattern語句塊中的通用命令是最重要的部分,也是可選的。

若是沒有提供pattern語句塊,則默認執行{ print } ,即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊。

 

 

 

 

 

 

 

四awk的print格式

 

 

awk的print格式: print     item1, item2, ...


(一)要點


(1)使用逗號做爲分隔符

 


(2)輸出的各item能夠字符串、數值、當前記錄的字段、變量、awk表達式



(3)省略item,至關於print $0,打印每一行

 

 

 

五awk的內置變量

 

awk的變量類型主要是內置變量,好比$0,$1.....,自定義變量

 

1FS:是field  split的簡寫,域,字段,列column,屬性。

做用是輸入文件的字段分隔符,默認爲空白字符。

與之相對應的是行,記錄,也就是record。

execl表格和數據庫裏面的表都是橫行縱列。

 -v表示的是對變量進行賦值。

 

 

 

 

 

 

 

(一)FS:設置輸入字段分隔符,和命令行-F等價,默認爲空白字符

[root@centos77 ~]# awk  -v   FS=':' '{print $1,$3}' /app/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 dbus 81 polkitd 999 sshd 74 postfix 89 wang 1000 mysql 27 apache 48

 

 

 

 

 

 

 

使用FS比-F更強大的功能在於能夠調用變量,這樣會更加的靈活

[root@centos77 ~]# awk -v FS=':' '{print $1,FS,$3}' /app/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 dbus : 81 polkitd : 999 sshd : 74 postfix : 89 wang : 1000 mysql : 27 apache : 48

 

 

 

 

 

以FS的值做爲分隔符

[root@centos77 ~]# awk  -v    FS=":" '{print $1FS$3}' /app/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 dbus:81 polkitd:999 sshd:74 postfix:89 wang:1000 mysql:27 apache:48

 

 

 

 

 

 

使用FS變量能夠調用bash裏面的變量

[root@centos77 ~]# sep=":";awk -v FS="$sep" '{print $1,FS,$3}' /app/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 dbus : 81 polkitd : 999 sshd : 74 postfix : 89 wang : 1000 mysql : 27 apache : 48

 

 

 

 

 

-F指定多分割符

 

以取IP地址爲例

[root@centos72 ~]# ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.137.72 netmask 255.255.255.0 broadcast 192.168.137.255 inet6 fe80::b029:2522:876f:5456 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:fc:69:f8 txqueuelen 1000 (Ethernet) RX packets 770189 bytes 48135532 (45.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1458827 bytes 3300993378 (3.0 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

 

 

 

 

 

中括號裏面空幾格和實際狀況有關,分割符最好是使用雙引號,以示區別

NR==2{print $2}表示第2行,第2個字段,分隔符爲第1個分隔符(inet )

[root@centos72 ~]# ifconfig  ens33  |  awk -F "(inet )|( netmask)" 'NR==2{print $2}' 192.168.137.72 [root@centos72 ~]# ifconfig ens33 | awk -F "( inet )|( netmask )" 'NR==2{print $2}' 192.168.137.72 [root@centos72 ~]# ifconfig ens33 | awk -F "(inet)|( netmask)" 'NR==2{print $2}' 192.168.137.72 

 

 

 

分割符若是不加引號就會報錯

[root@centos72 ~]#  ifconfig  ens33  |  awk -F ( inet )|( netmask ) 'NR==2{print $2}' -bash: syntax error near unexpected token `('

 

 

 

 

 

法2:

IP地址的左邊是空格,能夠用空格做爲分隔符;右邊是空格,能夠用空格做爲分隔符
行的最左邊是多個空格那麼就結合正則表達式的加號+,表示重複前面一個字符一次或一次以上。
因此表示一個或多個空格做爲分隔符

[root@centos72 ~]# ifconfig  ens33  |  awk -F "[ ]+" 'NR==2{print $3}' 192.168.137.72

 

 

 

[root@centos72 ~]#  ifconfig ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.137.72 netmask 255.255.255.0 broadcast 192.168.137.255 inet6 fe80::b029:2522:876f:5456 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:fc:69:f8 txqueuelen 1000 (Ethernet) RX packets 770482 bytes 48162199 (45.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1459030 bytes 3301018060 (3.0 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

 

 

 

 

分割符若是不加引號就會報錯

[root@centos72 ~]#  ifconfig  ens33  |  awk -F [ :]+ 'NR==2{print $3}' awk: cmd. line:1: :]+ awk: cmd. line:1: ^ syntax error [root@centos72 ~]# ifconfig ens33 | awk -F '[ :]+' 'NR==2{print $3}' 192.168.137.72

 

 

 

 

 

 

 

 

(二)OFS:輸出字段分隔符,默認爲空白字符

 

輸入分隔符是對文件的判斷,這樣才知道是$1,$2,起到了定位的做用。

[root@centos77 ~]# awk  -v    FS=":" -v OFS="+++" '{print $1,$3}' /app/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 dbus+++81 polkitd+++999 sshd+++74 postfix+++89 wang+++1000 mysql+++27 apache+++48 [root@centos77 ~]# awk -v OFS="+++" '{print $1,$3}' /app/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+++ ftp:x:14:50:FTP+++ nobody:x:99:99:Nobody:/:/sbin/nologin+++ systemd-network:x:192:192:systemd+++Management:/:/sbin/nologin dbus:x:81:81:System+++bus:/:/sbin/nologin polkitd:x:999:998:User+++polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated+++ postfix:x:89:89::/var/spool/postfix:/sbin/nologin+++ wang:x:1000:1000:wang:/home/wang:/bin/bash+++ mysql:x:27:27:MariaDB+++ apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin+++

 

 



 

 

 

(三)RS:輸入記錄分隔符,指定輸入時的換行符

 

回車換行做爲行的分隔符。

 

下面能夠認爲是兩行。

mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

 

 

 

 

 

可是也能夠設置爲以;做爲行的分隔符。

因此下面能夠認爲是兩行。

mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin;apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

 

 

取/etc/passwd的最後一行說明,把全部的冒號修改爲分號。

巧記好比以分號做爲記錄的分隔符。那麼記錄的數量就是分號的數量+1

 

apache;x;48;48;Apache;/usr/share/httpd;/sbin/nologin
apache;x;48;48;Apache;/usr/
share/httpd;/sbin/nologin
 
apache;x;48;48;Apache;/usr/
share/httpd;/sbin/
nologin

上面都是6個分號,那麼就是7條記錄了。


 

 

 

 

 

 

設置分號做爲輸入記錄的分隔符

要打印字段,默認是空白符做爲分隔符,回車也是空白符。

[root@centos77 ~]# cat RS1.txt apache;x;48;48;Apache;/usr/ share/httpd;/sbin/ nologin  [root@centos77 ~]# awk -v RS=";" '{print $1}' RS1.txt apache x 48 48 Apache /usr/ /sbin/ [root@centos77 ~]# awk -v RS=";" '{print $2}' RS1.txt share/httpd nologin [root@centos77 ~]# awk -v RS=";" '{print $3}' RS1.txt

 

 

 

 

 

 

 

 

設置空格做爲分隔符。

注意同一列不一樣行,好比第1行和第2行,就是空了兩格。

由於沒有定義字段的分隔符,回車換行也是空白分隔符。

[root@centos77 ~]# vim  RS2.txt
[root@centos77 ~]# cat RS2.txt a b aa bb aaa bb aaa [root@centos77 ~]# awk -v RS=" " '{print $1,$2}' RS2.txt a b aa bb aaa bb aaa

 

 

 

 

 

 

(四)ORS:輸出記錄分隔符

 

輸出時用指定符號代替回車換行符。

[root@centos77 ~]# awk -v RS=' ' -v ORS='###' '{print }' RS2.txt a###b aa###bb aaa###bb aaa

 

 

 

[root@centos77 ~]# awk -v RS=" " -v ORS='###' '{print }' RS2.txt a###b aa###bb aaa###bb aaa

 

 

 

 

 

 

(五)NF:顯示一行裏面的字段數量

[root@centos77 ~]# awk  -F: '{print NF}' /etc/fstab 0 1 1 1 1 1 1 1 1 1 1 1 1
[root@centos77 ~]# cat  /etc/fstab # # /etc/fstab # Created by anaconda on Thu Jan 24 19:04:38 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 /dev/cdrom /mnt iso9660 defaults 0 0

 

 

 

 

 

 

 

[root@centos72 ~]# awk  -F":" '{print NF}' /etc/fstab 0 1 1 3 1 1 1 1 1 1 1 1 [root@centos72 ~]# awk -F":" '{print NF}' /etc/fstab | wc 12 12 24

 

[root@centos72 ~]# awk  -F: '{print NF}' /etc/fstab 0 1 1 3 1 1 1 1 1 1 1 1 [root@centos72 ~]# awk -F: '{print NF}' /etc/fstab | wc 12 12 24

 

 

 

 

 

 

[root@centos77 ~]# awk  -F:  '{print NF}' /etc/passwd 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

 

 

 

 

 

 

 

 

(六)$NF顯示一行最後一個字段

[root@centos77 ~]# awk  -F:  '{print $NF}' /etc/passwd /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/bash /sbin/nologin /sbin/nologin 

 

 

 

 

[root@centos77 ~]# cat  /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 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 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 wang:x:1000:1000:wang:/home/wang:/bin/bash mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin 

 

 

 

 

 

 

 

注意顯示倒數第2就要在$後面加上中括號

[root@centos77 ~]# awk  -F:  '{print $NF-1}' /etc/passwd -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

 

 

 

 

 正確的寫法

[root@centos77 ~]# awk  -F:  '{print $(NF-1)}' /etc/passwd /root /bin /sbin /var/adm /var/spool/lpd /sbin /sbin /sbin /var/spool/mail /root /usr/games /var/ftp / / / / /var/empty/sshd /var/spool/postfix /home/wang /var/lib/mysql /usr/share/httpd

 

 

 

 

 

 

 

 

[root@centos77 ~]# ss  -nt
State      Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 52 192.168.137.77:22 192.168.137.34:61644 [root@centos77 ~]# ss -nt | awk -F: '{print $NF}' Port 61644 [root@centos77 ~]# ss -nt | awk '{print $NF}' Address:Port 192.168.137.34:61644 [root@centos77 ~]# ss -nt | awk '{print $NF}' | awk -F: '{print $NF}' Port 61644

 

 

 

 

[root@centos77 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 51175000 1421948 49753052 3% / devtmpfs 487964 0 487964 0% /dev tmpfs 498988 0 498988 0% /dev/shm tmpfs 498988 7832 491156 2% /run tmpfs 498988 0 498988 0% /sys/fs/cgroup /dev/sr0 4364408 4364408 0 100% /mnt /dev/sda3 20961280 32948 20928332 1% /app /dev/sda1 1038336 126596 911740 13% /boot tmpfs 99800 0 99800 0% /run/user/0 [root@centos77 ~]# df | grep /dev/sd /dev/sda2 51175000 1421948 49753052 3% / /dev/sda3 20961280 32948 20928332 1% /app /dev/sda1 1038336 126596 911740 13% /boot [root@centos77 ~]# df | grep /dev/sd | awk '{print $(NF-1) }' 3% 1% 13% [root@centos77 ~]# df | grep /dev/sd | awk '{print $(NF-1) }' | awk -F% '{print $1}' 3 1 13

 

 

 

 

 

使用cut也能夠顯示

[root@centos72 ~]# cut -d:   -f7 /etc/passwd | head /bin/bash /sbin/nologin /sbin/nologin /sbin/nologin /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt /sbin/nologin /sbin/nologin [root@centos72 ~]# cat /etc/passwd | head 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

 

 

 

 

 

 

 

(七)NR:記錄號,默認狀況是行號

 

 

注意空行也算行號

[root@centos77 ~]# awk '{print NR}' /etc/fstab 1 2 3 4 5 6 7 8 9 10 11 12 13

 

[root@centos77 ~]# cat  /etc/fstab   -n 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jan 24 19:04:38 2019 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /dev/cdrom /mnt iso9660 defaults 0 0 

 

 

 

 

 

 

 給文件每行內容加上行號

[root@centos77 ~]# awk '{print NR,$0}' /etc/fstab 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jan 24 19:04:38 2019 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /dev/cdrom /mnt iso9660 defaults 0 0

 

 

 

 

 

 

若是是在命令行輸入兩個文件,那麼就會按照順序顯示,整合成一個文件的編號

[root@centos77 ~]# awk '{print NR,$0}' /etc/fstab /etc/issue 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jan 24 19:04:38 2019 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /dev/cdrom /mnt iso9660 defaults 0 0 14 \S 15 Kernel \r on an \m 16 [root@centos77 ~]# cat /etc/issue \S Kernel \r on an \m

 

 

 

 

 

 

顯示文件第幾行

 

和shell腳本同樣,==表示判斷是否相等

[root@centos72 ~]# awk  'NR==2' /etc/issue Kernel \r on an \m [root@centos72 ~]# cat -n /etc/issue 1 \S 2 Kernel \r on an \m 3 

 

 

 

 

 

 

顯示文件一部份內容,從第幾行到第幾行

[root@centos72 ~]# awk  'NR==1,NR==5' /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 [root@centos72 ~]# head -n5 /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

 

 

 

 

 

 

 

顯示文件第幾行到第幾行,而且顯示行號

[root@centos72 ~]# awk  'NR==1,NR==7 {print NR,$0}' /etc/passwd 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

 

 

 

[root@centos72 ~]# head  -n  7 /etc/passwd | cat -n 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

 

 

 

 

 

 

 

 

 

 

 

(八)FNR:各文件分別計數,記錄號

 

每一個文件都有獨立的編號,和七相反

[root@centos77 ~]# awk '{print FNR,$0}' /etc/fstab /etc/issue 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jan 24 19:04:38 2019 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /dev/cdrom /mnt iso9660 defaults 0 0 1 \S 2 Kernel \r on an \m 3 

 

 

 

 

 

 

 

(九)FILENAME:顯示當前文件名,awk瀏覽的文件名

 

 

後面的文件名至關於參數,文件內容被替換爲對應的文件名

[root@centos77 ~]# awk '{print FILENAME}' /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab [root@centos77 ~]# awk '{print FILENAME,$0}' /etc/fstab /etc/fstab /etc/fstab # /etc/fstab # /etc/fstab /etc/fstab # Created by anaconda on Thu Jan 24 19:04:38 2019 /etc/fstab # /etc/fstab # Accessible filesystems, by reference, are maintained under '/dev/disk' /etc/fstab # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info /etc/fstab # /etc/fstab UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 /etc/fstab UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 /etc/fstab UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 /etc/fstab UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 /etc/fstab /dev/cdrom /mnt iso9660 defaults 0 0 [root@centos77 ~]# awk '{print FNR,FILENAME,$0}' /etc/fstab 1 /etc/fstab 2 /etc/fstab # 3 /etc/fstab # /etc/fstab 4 /etc/fstab # Created by anaconda on Thu Jan 24 19:04:38 2019 5 /etc/fstab # 6 /etc/fstab # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 /etc/fstab # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 /etc/fstab # 9 /etc/fstab UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 /etc/fstab UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 /etc/fstab UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 /etc/fstab UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /etc/fstab /dev/cdrom /mnt iso9660 defaults 0 0

 

 

 

 

 

 

(十)ARGC:命令行參數個數

 

ARG表示的是argument參數

這裏的參數指的是是命令awk,後面的文件名 /etc/fstab 、/etc/issue

分別表示參數一、參數二、參數3

這種玩法是比較新鮮的,在三劍客裏面的其餘兩個並無這種功能

可能和林納斯.託瓦茨同樣,只是爲了好玩

[root@centos77 ~]# awk '{print ARGC}' /etc/fstab /etc/issue 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3

 

 

 

 

 

[root@centos72 ~]# awk '{print ARGC}' /etc/issue 2 2 2 [root@centos72 ~]# cat /etc/issue \S Kernel \r on an \m

 

 

 

 

 

 

[root@centos72 ~]# awk '{print ARGC}' /etc/issue /etc/passwd /etc/fstab | wc 65 65 130 [root@centos72 ~]# awk '{print ARGC}' /etc/issue /etc/passwd /etc/fstab | head 4 4 4 4 4 4 4 4 4 4 [root@centos72 ~]# awk '{print ARGC}' /etc/issue /etc/passwd /etc/fstab | tail 4 4 4 4 4 4 4 4 4 4

 

 

 

 

 

 

 

 注意是文件名才能夠,目錄名會報錯

[root@centos72 ~]# awk '{print ARGC}' /etc awk: warning: command line argument `/etc' is a directory: skipped [root@centos72 ~]# awk '{print ARGC}' /etc/ awk: warning: command line argument `/etc/' is a directory: skipped [root@centos72 ~]# ll -d /etc/ drwxr-xr-x. 75 root root 8192 Jul 15 16:56 /etc/

 

 

 

 

 

 

 

 

 

 

(十一)ARGV:數組,保存的是命令行所給定的各參數

 

 

 

顯示了命令行的參數1,也就是命令awk

[root@centos77 ~]# awk    '{print ARGV[0]}' /etc/fstab /etc/issue awk awk awk awk awk awk awk awk awk awk awk awk awk awk awk awk

 

 

 

 

 

 顯示了命令行的參數2

[root@centos77 ~]# awk    '{print ARGV[1]}' /etc/fstab /etc/issue /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab /etc/fstab

 

 

 

 

 

 

 

 顯示了命令行的參數3

[root@centos77 ~]# awk    '{print ARGV[2]}' /etc/fstab /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue /etc/issue

 

 

 

 

 

 

 

 

六awk的自定義變量

 

注意區分字符大小寫


(一) -v     var=value

 

[root@centos77 ~]#    awk -v       test='hello gawk' -F: '{print $1,test,$2}' /etc/passwd root hello gawk x bin hello gawk x daemon hello gawk x adm hello gawk x lp hello gawk x sync hello gawk x shutdown hello gawk x halt hello gawk x mail hello gawk x operator hello gawk x games hello gawk x ftp hello gawk x nobody hello gawk x systemd-network hello gawk x dbus hello gawk x polkitd hello gawk x sshd hello gawk x postfix hello gawk x wang hello gawk x mysql hello gawk x apache hello gawk x 

 

 

 

 

[root@centos72 ~]#   awk -v       test='hello gawk' '{print $1,test,$2}' /etc/issue \S hello gawk Kernel hello gawk \r hello gawk [root@centos72 ~]# cat /etc/issue \S Kernel \r on an \m

 

 

 

 

[root@centos77 ~]#    awk -v       test='hello gawk' '{print $1,test,$2}' /etc/passwd root:x:0:0:root:/root:/bin/bash hello gawk bin:x:1:1:bin:/bin:/sbin/nologin hello gawk daemon:x:2:2:daemon:/sbin:/sbin/nologin hello gawk adm:x:3:4:adm:/var/adm:/sbin/nologin hello gawk lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin hello gawk sync:x:5:0:sync:/sbin:/bin/sync hello gawk shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown hello gawk halt:x:7:0:halt:/sbin:/sbin/halt hello gawk mail:x:8:12:mail:/var/spool/mail:/sbin/nologin hello gawk operator:x:11:0:operator:/root:/sbin/nologin hello gawk games:x:12:100:games:/usr/games:/sbin/nologin hello gawk ftp:x:14:50:FTP hello gawk User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin hello gawk systemd-network:x:192:192:systemd hello gawk Network dbus:x:81:81:System hello gawk message polkitd:x:999:998:User hello gawk for sshd:x:74:74:Privilege-separated hello gawk SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin hello gawk wang:x:1000:1000:wang:/home/wang:/bin/bash hello gawk mysql:x:27:27:MariaDB hello gawk Server:/var/lib/mysql:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin hello gawk 

 

 

 

 

/etc/issue做爲測試效果的文件會比較好,由於裏面的文件內容幾乎不修改

[root@centos72 ~]#  awk -v       test='hello gawk' '{print $1,test,$2}' /etc/issue \S hello gawk Kernel hello gawk \r hello gawk 

 

 

 

 

 

[root@centos77 ~]#    awk -v     user="username" -v uid="uid" -F: '{print user":"$1" "uid":"$3}' /etc/passwd username:root uid:0 username:bin uid:1 username:daemon uid:2 username:adm uid:3 username:lp uid:4 username:sync uid:5 username:shutdown uid:6 username:halt uid:7 username:mail uid:8 username:operator uid:11 username:games uid:12 username:ftp uid:14 username:nobody uid:99 username:systemd-network uid:192 username:dbus uid:81 username:polkitd uid:999 username:sshd uid:74 username:postfix uid:89 username:wang uid:1000 username:mysql uid:27 username:apache uid:48

 

 

 

 

 

 

[root@centos77 ~]#    awk -v     user="username" -v uid="uid" -F: '{print user":"$1" \n "uid ":"$3}' /etc/passwd username:root uid:0 username:bin uid:1 username:daemon uid:2 username:adm uid:3 username:lp uid:4 username:sync uid:5 username:shutdown uid:6 username:halt uid:7 username:mail uid:8 username:operator uid:11 username:games uid:12 username:ftp uid:14 username:nobody uid:99 username:systemd-network uid:192 username:dbus uid:81 username:polkitd uid:999 username:sshd uid:74 username:postfix uid:89 username:wang uid:1000 username:mysql uid:27 username:apache uid:48

 

 

 

 

 

 

 

(二)在program中直接定義

 

這樣寫的缺點是不能調用bash的變量了。

[root@centos77 ~]#    awk       -v   uid="uid" -F: '{ user="username"; print user":"$1" \n "uid ":"$3}' 
/etc/passwd username:root uid:0 username:bin uid:1 username:daemon uid:2 username:adm uid:3 username:lp uid:4 username:sync uid:5 username:shutdown uid:6 username:halt uid:7 username:mail uid:8 username:operator uid:11 username:games uid:12 username:ftp uid:14 username:nobody uid:99 username:systemd-network uid:192 username:dbus uid:81 username:polkitd uid:999 username:sshd uid:74 username:postfix uid:89 username:wang uid:1000 username:mysql uid:27 username:apache uid:48

 

 

 

 

 

 

 

下面使用到了bash變量u

[root@centos77 ~]# u="user";awk -v username="$u" -F: '{uid="uid";print username":"$1"\n"uid":"$3 }' /etc/passwd user:root uid:0 user:bin uid:1 user:daemon uid:2 user:adm uid:3 user:sync uid:5 user:shutdown uid:6 user:halt uid:7 user:mail uid:8 user:operator uid:11 user:games uid:12 user:ftp uid:14 user:nobody uid:99 user:systemd-network uid:192 user:dbus uid:81 user:polkitd uid:999 user:sshd uid:74 user:postfix uid:89 user:wang uid:1000 user:mysql uid:27 user:apache uid:48

 

 

 

 

 

 

 

先使用變量再對變量進行定義顯示的結果有誤

注意變量要先定義後使用。

全部的語言都是這樣的。

[root@centos77 ~]# awk      -F:   '{print username":"$1"\n"uid":"$3;username="user";uid="uid" }' /etc/passwd :root :0 user:bin uid:1 user:daemon uid:2 user:adm uid:3 user:lp uid:4 user:sync uid:5 user:shutdown uid:6 user:halt uid:7 user:mail uid:8 user:operator uid:11 user:games uid:12 user:ftp uid:14 user:nobody uid:99 user:systemd-network uid:192 user:dbus uid:81 user:polkitd uid:999 user:sshd uid:74 user:postfix uid:89 user:wang uid:1000 user:mysql uid:27 user:apache uid:48

 

 

 

 

 

 

定義了變量以後會存儲到內存裏面的。

能夠把常常寫的awk命令寫入到文件裏面,這樣方便調用。

[root@centos77 ~]# awk   -F:  -f    awkscript   /etc/passwd username:root uid: 0 username:bin uid: 1 username:daemon uid: 2 username:adm uid: 3 username:lp uid: 4 username:sync uid: 5 username:shutdown uid: 6 username:halt uid: 7 username:mail uid: 8 username:operator uid: 11 username:games uid: 12 username:ftp uid: 14 username:nobody uid: 99 username:systemd-network uid: 192 username:dbus uid: 81 username:polkitd uid: 999 username:sshd uid: 74 username:postfix uid: 89 username:wang uid: 1000 username:mysql uid: 27 username:apache uid: 48 [root@centos77 ~]# cat awkscript {user="username";uid="uid";print user":"$1,uid":",$3} 

 

 

 

 

 

 

 

 

七awk示例

 

 

(一)最簡打印awk      '{print "hello,awk"}'    文件名

 

 

使用了基本格式:awk [options] 'program' file…

其中涉及到了action statements對數據進行處理,放在{}內指明,不涉及pattern

最外面的單引號引發來的是awk的程序代碼,不涉及到模式就處理全部行。

涉及到了print格式: print item1, item2, ...

這裏的action就是打印print這個動做

[root@centos77 app]# awk '{print "hello,awk"}' /etc/fstab hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk

 

 

 

 

不寫模式就是處理全部的行

爲何打印這麼多行,由於文件 /etc/fstab 有13行,全部的行都符合條件。

[root@centos77 app]# cat  /etc/fstab    -n 1 2 # 3 # /etc/fstab 4 # Created by anaconda on Thu Jan 24 19:04:38 2019 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # 9 UUID=ac478774-8c43-475c-b9f5-b2f4de773371 / xfs defaults 0 0 10 UUID=20d0ead8-ff20-43a0-936d-2fe5f733a4cf /app xfs defaults 0 0 11 UUID=0ade30c3-a2e1-4150-88c4-29ad1acdb3c3 /boot xfs defaults 0 0 12 UUID=cde1f1c4-4f89-4618-80bb-30042181c194 swap swap defaults 0 0 13 /dev/cdrom /mnt iso9660 defaults 0 0 [root@centos77 app]# awk '{print "hello,awk"}' /etc/fstab | wc 13 13 130 

 

 

 

 

 

 

後面不加文件名就是讀入一行對這行進行處理,包括空行

[root@centos77 app]# awk '{print "hello,awk"}' a hello,awk dd hello,awk aadfff hello,awk afghre hello,awk ghjew hello,awk hello,awk df hello,awk hello,awk hello,awk hello,awk

 

 

 

 

 

 回車以後的結果

[root@centos72 ~]# awk '{print "hello,awk"}' hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk

 

 

 

 

 

 

 

管道把前面的標準輸入做爲後面的標準輸出

[root@centos77 app]# cat  /etc/fstab    |     awk '{print "hello,awk"}' hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk

 

 

 

 

 輸入重定向

[root@centos77 app]# awk '{print "hello,awk"}' < /etc/fstab hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk

 

 

 

 

 

 

 

 

 

(二)指定分割符

 

指定分割符爲冒號

[root@centos72 ~]# awk  -F:   '{print  $1}'  /etc/passwd  | head
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

 

 

 

 

 

[root@centos72 ~]# cat  /etc/passwd  | head
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

 

 

 

 

 

分隔符加不加引號均可以

[root@centos72 ~]# awk  -F":"   '{print  $1}'  /etc/passwd  | head
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

 

 

 

 

[root@centos72 ~]# awk  -F':'   '{print  $1}'  /etc/passwd  | head
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

 

 

 

 

 

 

打印整行

[root@centos72 ~]# awk  -F:   '{print  $0}'  /etc/passwd  | head
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

 

 

 

 

 

 

 

 

(三)對打印的items進行換行\n

 

 

默認是換成空行

[root@centos77 app]# awk '{print "hello,awk\n"}' /etc/fstab hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk hello,awk

 

 

 

 

 

[root@centos72 ~]# awk '{print "hello,awk\n"}' /etc/issue hello,awk hello,awk hello,awk [root@centos72 ~]# awk '{print "hello,awk"}' /etc/issue hello,awk hello,awk hello,awk

 

 

 

 

 

 

[root@centos77 app]# awk '{print "hello,awk\nhello world"}' /etc/fstab hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world hello,awk hello world

 

 

 

 

 

 

 

 

(四)進行數字運算

 

 

注意字符串都要使用雙引號引發來,數字運算不加雙引號。

[root@centos77 app]# awk '{print 2*3}' /etc/fstab 6 6 6 6 6 6 6 6 6 6 6 6 6

 

 

 

 

 

[root@centos77 app]# awk '{print "2*3"}' /etc/fstab 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3 2*3

 

 

 

 

 

 可是能夠加單引號

[root@centos72 ~]#  awk '{print '2*3'}'       /etc/fstab    
6
6
6
6
6
6
6
6
6
6
6
6

 

 

 

 

 

 

 

[root@centos77 app]# awk '{print 2^3}' /etc/fstab 8 8 8 8 8 8 8 8 8 8 8 8 8

 

 

 

 

 

 

 

 

 

(五)支持浮點數

 

下面進行除法運算的時候顯示了小數點

[root@centos77 app]# awk '{print 2/3}' /etc/fstab 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 0.666667 

 

 

 

 

 

 

 

 

(六)對文件取出特定的字段

[root@centos77 ~]# cp  /etc/passwd /app/ [root@centos77 ~]# cd /app/ [root@centos77 app]# ls passwd [root@centos77 app]# cat 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 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin 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 wang:x:1000:1000:wang:/home/wang:/bin/bash mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

 

 

 

 

 

 

使用cut取特定的字段

用冒號做爲分隔符,取出文件的第3個字段。

[root@centos77 ~]# cut -d: -f3   /etc/passwd 0 1 2 3 4 5 6 7 8 11 12 14 99 192 81 999 74 89 1000 27 48

 

 

 

 

 

 

 

使用awk取出特定的字段

awk   –F:   ‘{print   $1}’    /etc/passwd

 

-F:表示的分隔符是冒號。

-F和cut 裏面的-d是等價的

$1表示的文件的第1個字段,至關於cut裏面的-f1

這個就和國家的語言同樣,表達上不同,可是意思是同樣的

[root@centos77 ~]# awk   -F:  '{print $3}' /app/passwd 0 1 2 3 4 5 6 7 8 11 12 14 99 192 81 999 74 89 1000 27 48

 

 

 

 

 

 

 

[root@centos77 ~]# awk   -F:  '{print $1}' /app/passwd root bin daemon adm lp sync shutdown halt mail operator games ftp nobody systemd-network dbus polkitd sshd postfix wang mysql apache 

 

 

 

 

 

 

 

取出日誌的第1個字段

[root@centos77 ~]# cat  /var/log/httpd/access_log   |  head 
192.168.137.34 - - [25/Jan/2019:14:35:37 +0800] "GET /info.php HTTP/1.1" 404 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
192.168.137.34 - - [25/Jan/2019:14:35:37 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
192.168.137.34 - - [25/Jan/2019:14:35:46 +0800] "GET / HTTP/1.1" 200 44251 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
192.168.137.34 - - [25/Jan/2019:14:35:47 +0800] "GET /index.php?=PHPE9568F34-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2524 "http://192.168.137.77/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
192.168.137.34 - - [25/Jan/2019:14:35:47 +0800] "GET /index.php?=PHPE9568F35-D428-11d2-A769-00AA001ACF42 HTTP/1.1" 200 2146 "http://192.168.137.77/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
192.168.137.62 - - [25/Jan/2019:14:39:52 +0800] "GET /info.php HTTP/1.0" 404 16 "-" "ApacheBench/2.3"
192.168.137.62 - - [25/Jan/2019:14:39:52 +0800] "GET /info.php HTTP/1.0" 404 16 "-" "ApacheBench/2.3"
192.168.137.62 - - [25/Jan/2019:14:39:52 +0800] "GET /info.php HTTP/1.0" 404 16 "-" "ApacheBench/2.3"
192.168.137.62 - - [25/Jan/2019:14:39:52 +0800] "GET /info.php HTTP/1.0" 404 16 "-" "ApacheBench/2.3"
192.168.137.62 - - [25/Jan/2019:14:39:52 +0800] "GET /info.php HTTP/1.0" 404 16 "-" "ApacheBench/2.3"

 

 

 

[root@centos77 ~]# cat  /var/log/httpd/access_log    |   awk '{print $1}' | head 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.62 192.168.137.62 192.168.137.62 192.168.137.62 192.168.137.62

 

 

 

 

 

 

[root@centos77 ~]#  awk    '{print $1}' /var/log/httpd/access_log | head 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.34 192.168.137.62 192.168.137.62 192.168.137.62 192.168.137.62 192.168.137.62

 

 

 

 

 

 

 

使用awk同時取出多個字段

[root@centos77 ~]# awk   -F:  '{print $1,$3,$5,$7}' /app/passwd root 0 root /bin/bash bin 1 bin /sbin/nologin daemon 2 daemon /sbin/nologin adm 3 adm /sbin/nologin lp 4 lp /sbin/nologin sync 5 sync /bin/sync shutdown 6 shutdown /sbin/shutdown halt 7 halt /sbin/halt mail 8 mail /sbin/nologin operator 11 operator /sbin/nologin games 12 games /sbin/nologin ftp 14 FTP User /sbin/nologin nobody 99 Nobody /sbin/nologin systemd-network 192 systemd Network Management /sbin/nologin dbus 81 System message bus /sbin/nologin polkitd 999 User for polkitd /sbin/nologin sshd 74 Privilege-separated SSH /sbin/nologin postfix 89 /sbin/nologin wang 1000 wang /bin/bash mysql 27 MariaDB Server /sbin/nologin apache 48 Apache /sbin/nologin

 

 

 



 

 

取出分區的利用率

awk是默認以空白符做爲分隔符,使用時可不寫分隔符

注意單引號和花括號程序之間的空格沒有限制,也就是能夠空格,也能夠不空格,這個看我的的喜愛了。

使用awk比tr會更方便。

[root@centos77 ~]# df  |  grep /dev/sd | awk '{print $5}' 3% 1% 13% [root@centos77 ~]# df | grep /dev/sd | awk '{ print $5 }' 3% 1% 13% [root@centos77 ~]# df | grep /dev/sd | awk ' { print $5 } ' 3% 1% 13%

 

 

 

 

 

注意默認在程序裏面加逗號就會在顯示結果中空格,不加逗號能夠在中間加上雙引號

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print $1,$5 } ' /dev/sda2 3% /dev/sda3 1% /dev/sda1 13%

 

 

 

 

 

在程序裏面中間加上雙引號顯示結果也會空格

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print $1" " $5 } ' /dev/sda2 3% /dev/sda3 1% /dev/sda1 13% [root@centos77 ~]# df | grep /dev/sd | awk ' { print $1" "$5 } ' /dev/sda2 3% /dev/sda3 1% /dev/sda1 13%

 

 

 

 

 

 

兩個字段空格顯示結果不會空格

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print $1 $5 } ' /dev/sda23% /dev/sda31% /dev/sda113%

 

 

 

 

 

 

也能夠設置分隔符。

==表示的是分隔符,也是字符串,必定要加雙引號引發來。

$1是變量,不能加上雙引號。

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print $1"=="$5 } ' /dev/sda2==3% /dev/sda3==1% /dev/sda1==13% [root@centos77 ~]# df | grep /dev/sd | awk ' { print $1 "==" $5 } ' /dev/sda2==3% /dev/sda3==1% /dev/sda1==13%

 

 

 

 

 

 

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print $1 \t $5 } ' awk: cmd. line:1: { print $1 \t $5 } awk: cmd. line:1: ^ backslash not last character on line awk: cmd. line:1: { print $1 \t $5 } awk: cmd. line:1: ^ syntax error [root@centos77 ~]# df | grep /dev/sd | awk ' { print $1 "\n" $5 } ' /dev/sda2 3% /dev/sda3 1% /dev/sda1 13% [root@centos77 ~]# df | grep /dev/sd | awk ' { print $1 \n $5 } ' awk: cmd. line:1: { print $1 \n $5 } awk: cmd. line:1: ^ backslash not last character on line awk: cmd. line:1: { print $1 \n $5 } awk: cmd. line:1: ^ syntax error [root@centos77 ~]# df | grep /dev/sd | awk ' { print $1\n$5 } ' awk: cmd. line:1: { print $1\n$5 } awk: cmd. line:1: ^ backslash not last character on line awk: cmd. line:1: { print $1\n$5 } awk: cmd. line:1: ^ syntax error

 

 

 

 

 

 

把整行都打印出來,加上$0。

print默認就是把整行的內容打印出來。

[root@centos77 ~]# df  |  grep /dev/sd | awk ' { print } ' /dev/sda2 51175000 1421928 49753072 3% / /dev/sda3 20961280 32948 20928332 1% /app /dev/sda1 1038336 126596 911740 13% /boot [root@centos77 ~]# df | grep /dev/sd | awk ' { print $0 } ' /dev/sda2 51175000 1421928 49753072 3% / /dev/sda3 20961280 32948 20928332 1% /app /dev/sda1 1038336 126596 911740 13% /boot

 

 

 

 

 

 

 

(七)打印含有bash的行

[root@centos72 ~]# awk '/bash/' /etc/passwd  | head
root:x:0:0:root:/root:/bin/bash
wang:x:1000:1000:wang:/home/wang:/bin/bash
std01:x:1001:1002::/home/std01:/bin/bash
std02:x:1002:1003::/home/std02:/bin/bash
std03:x:1003:1004::/home/std03:/bin/bash
std04:x:1004:1005::/home/std04:/bin/bash
std05:x:1005:1006::/home/std05:/bin/bash
std06:x:1006:1007::/home/std06:/bin/bash
std07:x:1007:1008::/home/std07:/bin/bash
std08:x:1008:1009::/home/std08:/bin/bash
[root@centos72 ~]# awk 'bash' /etc/passwd  | head

 

 

 

 

 

 

 

(八)打印特定字段符合條件的行

 

打印第3個字段uid是1000的行

[root@centos72 ~]# awk   -F":"   '$3==1000' /etc/passwd 
wang:x:1000:1000:wang:/home/wang:/bin/bash

 

 

 

最好加雙引號

[root@centos72 ~]# awk   -F":"   '$3=="1000"' /etc/passwd 
wang:x:1000:1000:wang:/home/wang:/bin/bash

 

 

 

 

 

打印第1個字段用戶名是root的行

注意字符串要加雙引號

[root@centos72 ~]# awk   -F":"   '$1=="root"' /etc/passwd 
root:x:0:0:root:/root:/bin/bash

 

 

 

 

 

 

 

(九)打印行序號符合條件的行

 

打印行序號小於10的行

[root@centos72 ~]# awk   -F":"    'NR<10'  /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

 

 

 

 

[root@centos72 ~]# head  /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
[root@centos72 ~]# head  /etc/passwd  | wc
     10      10     385
[root@centos72 ~]# awk   -F":"    'NR<10'  /etc/passwd  |  wc
      9       9     340

 

 

 

 

 

打印行序號小於等於10的行

[root@centos72 ~]# awk   -F":"    'NR<=10'  /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
[root@centos72 ~]# awk   -F":"    'NR<=10'  /etc/passwd   |  wc
     10      10     385

 

 

 

 

 

 

 

 

 

(十)awk結合sed進行查找替換

 

 

查找用戶名爲daemond的行,而且替換爲wu

[root@centos72 ~]# awk   -F":"    '$1=="daemon"'  /etc/passwd   
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos72 ~]# awk   -F":"    '$1=="daemon"'  /etc/passwd   |  sed  's/daemon/wu/'

 

 

 

 

 

注意上面的命令僅僅是測試,麼有真正執行

[root@centos72 ~]# cat  /etc/passwd  |head
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
相關文章
相關標籤/搜索