Linux處理文本工具
grep: 過濾文本內容
sed: 編輯文本內容
awk: 顯示文本
awk: Aho Peter Weinberger Kernighan
報告生成器,以特定的條件查找文本內容,在以特定的格式顯示
awk命令的格式:
# awk [option] 'script' file1 file2...
# awk [option] 'PATTERM{action}' file1 file2...
PATTERN:
用文本字符與正則表達式元字符描述的條件,可以省略不寫
action:
print
printf 指定輸出項的格式:格式必須寫
option選項:
-F 指定文本分割符
awk處理文本機制:
awk將符合PATTERN的文本逐漸取出,並按照指定的分割符(默認為空白,通過—F選項可以指定分割符)進行分割,然后將分割后的每段按照特定的格式輸出
awk的輸出:
一 print
print的使用格式:
print item1,item,...
注意:
1,各項目間使用逗號分隔開,而輸出時以空白字符串為分隔
2,輸出的item可以為字符串,數值,當前的記錄的字段($1),變量或者awk的表達式,數值會先轉換字符串,然后輸出
3,print命令后面的item可以省略,此時其功能相當於print($0代表未分割的整行文本內容),因此,如果想輸出空行,則需要使用print "";
以空白分割,顯示文本的第一段及第二段內容
[root@wei awk]# awk '{print $1,$3}' print.txt
i wei
i zhang
[root@wei awk]# awk '{print "hello",$3}' print.txt
hello wei
hello zhang
顯示passwd的用戶名稱
[root@wei awk]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
顯示設備的掛載情況
[root@wei awk]# df -hT | sed '1d' | awk '{print "設備名稱:",$1,"掛載點:",$7,"總容量:",$3}'
設備名稱: /dev/mapper/centos-root 掛載點: / 總容量: 17G
設備名稱: devtmpfs 掛載點: /dev 總容量: 476M
設備名稱: tmpfs 掛載點: /dev/shm 總容量: 488M
awk變量
1 awk內置變量之記錄變量
FS:指定讀取文本時,所使用的行分隔符,默認為空白字符,相當於awk的—F選項
OFS:指定輸出的分隔符,默認為空白字符;
[root@wei awk]# head -n 1 /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
FS模式
[root@wei awk]# head -n 1 /etc/passwd | awk 'BEGIN{FS=":"}{print $1,$7}'
root /bin/bash
OFS模式
[root@wei awk]# head -n 1 /etc/passwd | awk -F: 'BEGIN{OFS="---"}{print $1,$7}'
root---/bin/bash
模式混合
[root@wei awk]# head -n 1 /etc/passwd | awk 'BEGIN{FS=":";OFS="---"}{print $1,$7}'
root---/bin/bash
2 awk內置變量之數據變量
NR:記錄awk所處理的文本行數,如果有多個文件,所有的文件統一進行計數
第 1 行內容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
第 2 行內容: ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
第 3 行內容: \S
第 4 行內容: Kernel \r on an \m
第 5 行內容:
注意:
print在顯示變量值時,不要使用$
FNR:記錄awk所處理的文本行數,如果有多個文件,所有的文件分別進行計數
[root@wei awk]# awk '{print "第",FNR,"行內容:",$0}' /etc/hosts /etc/issue
第 1 行內容: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
第 2 行內容: ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
第 1 行內容: \S
第 2 行內容: Kernel \r on an \m
第 3 行內容:
NF:記錄awk正在處理的當前行被分隔成幾個字段
[root@wei awk]# cat print.txt
i am wei
i am zhang
[root@wei awk]# awk '{print NF}' print.txt
3
3
[root@wei awk]# awk '{print $NF}' print.txt
wei
zhang
3 用戶自定義的變量
awk允許用戶自定義變量,變量名稱不能以數字開頭,且區分大小寫
示例:
方法一:使用-v選項
[root@wei awk]# head -n 3 /etc/passwd | awk -v test="hello" -F: '{print test,$1}'
hello root
hello bin
hello daemon
方法二:在BEGIN{}模式自定義變量
[root@wei awk]# head -n 3 /etc/passwd | awk -F: 'BEGIN{test="hello"}{print test,$1}'
hello root
hello bin
hello daemon