Linux shell awk中print及變量使用


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM