Linux 文本分析 | awk
awk 是 Linux 中非常強大的文本分析編程工具
awk 的輸入可以是標準輸入,文件或其他命令的輸出
awk 將輸入逐行讀入,以空格為默認分隔符進行切割并處理
基礎用法
篩選每一行的指定列
# 篩選第二列內容
# print 表示打印
echo "name1 china 22 address1" | awk '{print $2}'
echo -e "name1 china 22 address1\nname2 china 18" | awk '{print $1}'
# 打印多列,用逗號分隔
echo "name1 china 22 address1" | awk '{print $1,$2}'
-
awk 中默認以空格或 tab 鍵分割數據
-
$0表示所有列,$1表示第一列,$2表示第二列,以此類推
如果每一行的列不一致,而又想要最后一列數據,
# NF 表示每一行的字段數,$NF 表示最后一列
# 取倒數第二列則用 $(NF-1)
echo "name1 china 22 address1" | awk '{print $NF}'
-
常用的內置變量有:
NF 每一行字段數
FILENAME 當前文件名
FS 字段分隔符,默認是空格和制表符。
RS 行分隔符,用于分割每一行,默認是換行符。
OFS 輸出字段的分隔符,用于打印時分隔字段,默認為空格。
ORS 輸出記錄的分隔符,用于打印時分隔記錄,默認為換行符。
OFMT 數字輸出的格式,默認為%.6g。
自定義分隔符
# -F 參數,指定分隔符為豎線
echo "name1|china|22|address1" | awk -F '|' '{print $(NF-1)}'
條件
正則匹配
# 正則在兩個斜線中間
# 下面將篩選包含 ‘china’ 行的第一列
echo "name1|china|22|address1" | awk -F '|' '/china/ {print $1}'
邏輯判斷
# 篩選奇數行的第一列
echo "name1|china|22|address1" | awk -F '|' 'NR % 2 == 1 {print $1}'
# 根據每個字段的內容篩選內容
echo "name1|china|22|address1" | awk -F '|' '$2 == "china" && $3 <= "22" {print $1}'
if else
# if 語句在花括號內部
echo "name1|china|22|address1" | awk -F '|' '{if ($2 == "china" && $3 <= "22") print $1}'
# if else 結構
echo "name1|china|22|address1" | awk -F '|' '{if ($2 == "japan") print $1; else print "--"}'
函數
# 將篩選內容轉換為大寫
echo "name1|china|22|address1" | awk -F "|" '{print toupper($2)}'
-
常用的內置函數有:
tolower() 字符轉為小寫
length() 返回字符串長度
substr() 返回子字符串
sin() 正弦
cos() 余弦
sqrt() 平方根
rand() 隨機數
-
還有其他函數,如時間函數,字符串函數等
begin...end
前后加固定內容
# BEGIN 和 END 必須是大寫
# 在數據第一行顯示列名
echo "name1|china|22|address1" | awk -F "|" 'BEGIN {print "name|country"} {print $1"|"toupper($2)}'
# 最后一行輸出虛線結尾
echo "name1|china|22|address1" | awk -F "|" 'BEGIN {print "name|country"} {print $1"|"toupper($2)} END {print "-
-----"}'
- aws 先執行 BEGIN,然后讀取文件處理數據,最后執行 END
自定義變量
echo "name1 china 22 address1" | awk 'BEGIN {count = 0; count++} {print $1,$2} END {print "count is", count}'
循環語句
cat test.txt | awk 'BEGIN {count = 0} {name[count] = $1 count++} END {for (i = 0; i < NR; i++) print i,name[i]}'
-
awk 中同樣支持循環語句:
while
do...while
for
break
continue
awk 調用方式
命令行執行
在命令行中執行 awk 命令
cat test.txt | awk '{print $0}'
shell 腳本方式
類似 shell 文件,將 awk 命令寫入 sh 文件
將首行的解釋器改為 #!/bin/awk
awk 命令調用方式
將 awk 命令寫入 sh 文件,然后用 awk 命令調用
# awk-command.sh 是 awk 命令集文件
# test.txt 是需要處理的數據文件
awk -f awk-command.sh test.txt
awk 是一種編程語言,通用的變量定義,條件語句,循環語句,各種數據結構各種內置函數都有。
用到再慢慢積累

浙公網安備 33010602011771號