awk 內置變量
FS 設置輸入域分隔符,等價於命令行 -F選項
OFS 輸出域分隔符
NF 瀏覽記錄的域的個數
NR 已讀的記錄數
RS 控制記錄分隔符
ORS 輸出記錄分隔符
substr 截取指定的字符串
gsub 替換指定字符串
實例:
1. FS設置域分隔符 等於-F。
過濾出了/etc/passwd 文件中的第一列
[root@centos-1 ~]# awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
2.OFS 輸出域分隔符。
我們可以改變文件內容的分割符號,並且打印出來
文件內容如下
[root@centos-1 ~]# cat abc
123 456
abc bcd
aaa bbb
[root@centos-1 ~]# awk 'BEGIN{OFS=","}{print $1,$2}' abc
123,456
abc,bcd
aaa,bbb
注意:這種情況需要多列,單列是不行的
3.NF 瀏覽記錄的域的個數
打印出每行有幾列
[root@centos-1 ~]# awk '{print NF}' abc
2
2
2
4.NR 已讀的記錄數
awk 讀了幾行內容
[root@centos-1 ~]# awk '{print NR}' abc
1
2
3
5、ORS 輸出記錄分隔符
awk規定,對於文本文件,默認情況下,一條記錄對應一行,即記錄之間的默認分隔符是換行符;而一條記錄又可以分為多個字段,默認字段分隔符為空格。
[root@centos-1 ~]# cat abc
123
abc
aaa
[root@centos-1 ~]# awk 'BEGIN{ORS=","}{print $0}' abc
123,abc,aaa,[root@centos-1 ~]#
所以我們可以在編輯某些文件時,可以讓文件內容橫排顯示,並且加上一定的分割符號
6.substr($n,n) 打印指定的列,並且從指定的第n個字符開始打印
substr($n,n,m) 打印指定的列,並且從指定的第n個字符開始打印,到m個字符停止
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,1)}}' /etc/passwd
/bin/bash
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,2)}}' /etc/passwd
bin/bash
[root@centos ~]# awk 'BEGIN{FS=":"}{if(NR==1){print substr($NF,3)}}' /etc/passwd
in/bash
過濾IP
[root@server2 ~]# ifconfig |awk '{if(NR==2){print substr($2,6,12)}}'
192.168.3.12
將第一行的每個字符后面加一個空格
[root@server2 ~]# awk 'BEGIN{ORS=" "}{if(NR==1){for(i=1;i<=length();i++){print substr($0,i,1)}print "\n"}}' /etc/passwd
r o o t : x : 0 : 0 : r o o t : / r o o t : / b i n / b a s h
7.將第二段的數字替換成行號
[root@centos6 ~]# cat abc
hshs a=1 jsjs
hds a=1 isi
hshppls a=1 jswyuwe
hyeyeushs a=1 jspppjs
h555shs a=1 jsjs888dh
hshggghs a=1 jshehhjs
hshhhhshes a=1jsjs7iii
hshshhsjs a=1 suuejejs
hshgewheues a=1 jejejsjs
hsujejeuhs a=1 77ieh2ssjs
[root@centos6 ~]# awk '{sub($2,"a="NR);print > "abc"}' abc
print > "abc":將更改后的數據重定向到源文件當中。文件名必須要用雙引號引起來