linux awk命令用途,Linux:“awk”命令的妙用
awk是一個強大的文本分析工具,簡單來說awk就是把文件逐行讀入,(空格,制表符)為默認分隔符將每行切片,切開的部分再進行各種分析處理。
0、基本用法
awk是一個強大的文本分析工具,簡單來說awk就是把文件逐行讀入,(空格,制表符)為默認分隔符將每行切片,切開的部分再進行各種分析處理
awk
格式如下
awk?[-F?field-separator]?'commands'?input-file(s)
[-F 分隔符]是可選的,因為awk使用空格,制表符作為缺省的字段分隔符,因此如果要瀏覽字段間有空格,制表符的文本,不必指定這個選項,但如果要瀏覽諸如/etc/passwd文件,此文件各字段以冒號作為分隔符,則必須指明-F選項
echo?"this?is?a?test"?|?awk?'{?print?$0?}'
##?輸出為
this?is?a?test
讀取用戶輸入的字符串發現|,代表有管道。|左右被理解為簡單
,即前一個(左邊)簡單命令的標準輸出指向后一個(右邊)標準命令的標準輸入
awk
會根據分隔符將行分成若干個字段,$0為整行,$1為第一個字段,$2 為第2個地段,依此類推…
為打印一個字段或所有字段,使用print命令。這是一個
awk
動作
echo?"this?is?a?test"?|?awk?'{?print?$1?}'
##?輸出為
this
echo?"this?is?a?test"?|?awk?'{?print?$1,?$2?}'
##?輸出為
this?is
/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
舉幾個簡單的小需求
1、只顯示/etc/passwd的賬戶
awk?-F?:?'{?print?$1?}'?/etc/passwd
##?輸出為
root
bin
daemon
adm
lp
2、顯示/etc/passwd的第1列和第7列,用逗號分隔顯示,所有行開始前添加列名start1,start7,最后一行添加,end1,end7
awk?-F?':'?'BEGIN?{print?"start1,start7"}?{print?$1?","?$7}?END?{print?"end1,end7"}'?/etc/passwd
##?輸出為
start1,start7
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
end1,end7
BEGIN語句在所有文本處理動作執行之前被執行,END在所有文本處理動作執行之后被執行
3、統計/etc/passwd文件中,每行的行號,每行的列數,對應的完整行內容
awk?-F?:?'{?print?NR?"??"?NF?"??"?$0?}'?/etc/passwd
##?輸出為
1????7???root:x:0:0:root:/root:/bin/bash
2????7???bin:x:1:1:bin:/bin:/sbin/nologin
3????7???daemon:x:2:2:daemon:/sbin:/sbin/nologin
4????7???adm:x:3:4:adm:/var/adm:/sbin/nologin
5????7???lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1、支持內置變量
上面示例中
NR
,和
NF
其實就是
awk
的內置變量,一些內置變量如下
變量名?解釋
FILENAMEawk瀏覽的文件名
FS設置輸入字段分隔符,等價于命令行-F選項
NF?瀏覽記錄的字段個數
NR?已讀的記錄數
2、支持函數
輸出字符串的長度
awk?'BEGIN?{?print?length("this?is?a?text")?}'
## 輸出為
14
將
/etc/passwd
的用戶名變成大寫輸出
awk?-F?':'?'{?print?toupper($1)?}'?/etc/passwd
## 輸出為
ROOT
BIN
DAEMON
ADM
LP
常用函數如下
函數名?作用
toupper(s)返回s的大寫
tolower(s)?返回s的小寫
length(s)?返回s長度
substr(s,p)?返回字符串s中從p開始的后綴部分
3、支持條件操作,正則表達式匹配
顯示/etc/passwd中有daemon的行
awk -F ':' '$0 ~ /daemon/' /etc/passwd
## 輸出為
daemon:x:2:2:daemon:/sbin:/sbin/nologin
awk條件操作符
操作符描述
if?while?do/while?for?break?continue
輸出第一個字段的第一個字符大于d的行
awk?-F?':'?'{?if?($1?>?"d")?{?print?$1?}?else?{?print?"-"?}?}'?/etc/passwd
## 輸出為
root
-
daemon
-
lp
可以把流程控制語句放到一個
中,然后調用
執行,如test.sh的內容如下
{
if?($1?>?"d")?{
print?$1
}?else?{
print?"-"
}
}
用如下方式執行,效果一樣
awk?-F?':'?-f?test.sh?/etc/passwd
## 輸出為
root
-
daemon
-
lp
5、應用場景
小編用awk進行文本分析比較少,主要用來寫腳本
如一個weibo-interface-1.0.jar應用,啟動腳本如下
start.sh
nohup?java?-jar?weibo-interface-1.0.jar?>out?2>&1?&
關閉腳本如下,
kill.sh
kill?-9?`jps?-l?|?grep?'weibo-interface-1.0.jar'?|?awk?'{print?$1}'`
jps -l的輸出如下
70208?com.st.kmp.main.KmpService
31036?com.st.cis.main.BaiduAnalysisService
66813?weibo-interface-1.0.jar
還有就是關閉hadoop集群的所有DataNode節點(不知道hadoop的可以認為DataNode是一個集群應用),假如一個個機器jps,查看pid,kill。很麻煩,直接寫了一個腳本,依次ssh到各個節點,然后執行如下命令即可
kill?`jps?|?grep?'DataNode'?|?awk?'{print?$1}'`
jps的輸出為
508?DataNode
31481?JournalNode
31973?NodeManager
總結
以上是生活随笔為你收集整理的linux awk命令用途,Linux:“awk”命令的妙用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux is执行程序命令,linux
- 下一篇: 信用卡为什么不通过