awk的工作模式
awk是一個文本處理工具,通常用于處理數據并生成結果報告
語法格式
第一種形式
awk 'BEGIN{}pattern{commands}END{}' file_name
語法格式解釋
BEGIN正式處理數據之前
pattern匹配模式
{commands}匹配命令,可能多行
END處理完所有匹配數據后執行
第二種形式
standard output | awk 'BEGIN{}pattern{commands}END{}'
awk的內置變量
內置變量含義
$0整行內容
$1-$n當前行的第1-n個字段(按照指定分隔符分割后)
NF(Number Field)當前行的字段個數,也就是多少列
NR(Number Row)當前行的行號,從1開始計數
FNR(File Number Row)多文件處理時,每個文件行號單獨計數,都是從0開始
FS(Field Separator)輸入字段分割符。不指定默認以空格或者Tab鍵分割
RS(Row Separator)輸入行分割符。默認回車n
OFS(Output Field Sepatator)輸出字段分割符。默認為空格
ORS(Output Row)輸出行分隔符。默認為回車
FILENAME當前輸入的文件名字
ARGC命令行參數個數
ARGV命令行參數數組
看一下/etc/passwd文件的內容
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
輸出文件的每行內容
awk '{print $0}' /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
輸出第二列內容
需要指定分隔符:
awk 'BEGIN{FS=":"}{print $2}' /etc/passwd x x x
不需要指定分割符,默認空格,tab鍵,多個也可以分隔(如一個空格+一個tab鍵)
show.txt文件內容如下
# 空格分隔 Python JAVA php # tab鍵分隔 flink hadoop storm
awk '{print $1}' show.txt
輸出如下:
python flink
輸出每一行有多少列
awk '{print NF}' show.txt
輸出如下
3 3
可以用這個輸出每一行的最后一列的值
awk '{print $NF}' show.txt
輸出行號
awk '{print NR}' show.txt
輸出如下(沒有混合使用,例子比較簡單)
1 2
對每個文件的行號單獨計數
awk '{print FNR}' show.txt /etc/passwd
同時指定行分隔符和列分隔符
show.txt的文件內容如下
python|java|php--flink|hadoop|storm
先輸出每一行數據
awk 'BEGIN{RS="--"}{print $0}' show.txt
輸入如下
python|java|php flink|hadoop|storm
輸出每一行的第二列
awk 'BEGIN{RS="--";FS="|"}{print $2}' show.txt
輸出如下
java hadoop
在上面基礎上指定行分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&"}{print $2}' show.txt
輸出如下
java&hadoop&
再次指定列分隔符
awk 'BEGIN{RS="--";FS="|";ORS="&";OFS="@@"}{print $1,$2}' show.txt
輸出如下
python@@java&flink@@hadoop&
輸出文件名字
show.txt的文件內容如下
python|java|php flink|hadoop|storm
awk '{print FILENAME}' show.txt
輸入如下,因為是對行進行處理,所以有幾行,輸出幾次文件名
show.txt show.txt
使用
jps -l輸入如下,運行的服務如下
34476 com.st.cis.main.WeiboSerachServer 4652 mbase-spider-parser-1.0.jar 43820 kolink-xhs-1.0.jar
想關閉mbase-spider-1.0.jar這個jar包的服務,可以寫一個如下腳本,非常方便,更高階用法另開一篇文章好好寫寫
pidfile=`jps -l | grep 'mbase-spider-1.0.jar' | awk '{print $1}'` kill -9 $pidfile if [ $? -eq 0 ] then echo "stop `hostname` kolink-xhs Success!" else echo "stop `hostname` kolink-xhs Failed!" fi