linux shell sed awk 命令(2)-awklinux
awk語法格式:正則表達式
awk [選項] -f program-file [ -- ] file ...shell
選項:ide
-F fs, --field-separator fs函數
制定以fs做爲輸入行的分隔符(默認分隔符爲空格或製表符)命令行
-v var=val, --assign var=val文檔
在執行過程之前,設置一個var值爲valget
-f program-file, --file program-fileit
從腳本文件中讀取awk指令,以取代在命令參數中輸入處理腳本io
-W compat, -W copyright, --compat, --traditional
使用兼容模式運行awk,GUN擴展選項將被忽略
-W dump-variables[=file], --dump-variables[=file]
打印全局變量(變量,類型,值)到文件中,若是沒有提供文件名,則自動輸出至名爲dump-variables文件中
awk -W dump-variables=out.txt 'x=1 {print x}' test.txt
eg:
1.經過正則表達式/^$/匹配空白行
awk '/^$/ {print "Blank line"}' eth0
2.打印包含主機名的行,沒有指定動做指令.默認動做爲打印
awk '/HOSTNAME/' /etc/sysconfig/network
3.指定腳本-f
(1)awk.sh內容以下:
/^$/ {print "Blank line"}
(2) awk -f awk.sh eth0
Blank line
Blank line
Blank line
Blank line
Blank line
記錄與字段
echo hello world abc | awk '{print $1,$2,$3}'
hello world abc
echo hello world abc | awk '{print $0}'
hello world abc
echo hello world abc | awk '{print NF}'
3
echo hello world abc | awk '{print $NF}'
abc
字段分隔符
awk -F: '{print $1}' /etc/passwd
awk 'BEGIN {FS=":"} {print $1}' passwd
//指定多個分隔符
echo 'hello the:world,!' | awk 'BEGIN {FS="[:, ]"} {print $1,$2,$3,$4}'
內置變量
ARGC 命令行參數
FILENAME 當前輸入文檔名稱
FNR 當前輸入文檔
NR 輸入流的當前記錄編號
NF 當前記錄字段數
FS 字符分割符
OFS 輸出字段分隔符,默認空格
ORS 輸出記錄分隔符,默認爲換行符\n
RS 輸入記錄分隔符,默認爲換行符\n
表達式與操做符
四則運算 + - * /
% 取餘 ^ 冪運算
自加自減
++ --
~匹配 !~不匹配
echo "test" | awk 'x=2 {print x+3}'
awk -F: '$1~/root/ {print $3}' /etc/passwd //打印root的ID號
awk -F: '$3>500 {print $1}' /etc/passwd //列出ID號大於500的用戶名
awk語法規則
if (表達式)
動做
else
動做
if (表達式) 動做;else 動做
eg:
//判讀sda4容量小於20MB時報警,不然顯示ok
df -h | grep "sda4" | awk '{if ($4<20000) print "Alart"; else print "OK"}'
while (條件)
動做
語法格式:
x=1
while (i<9) {
print $i
}
eg:
awk 'i=1 {} BEGIN { while (i<=10) { ++i; print i}}' test
do
動做
while (條件)
eg:
awk 'BEGIN { do {++x;print x} while (x<=10) }' test
for ( 變量; 條件; 計數器)
動做
eg:
awk 'BEGIN {for (i=1;i<=10;i++) print i}'
函數
1.rand()
awk 'BEGIN {print rand(); srand();print srand()}'
2.gsub(x,y,z),sub(x,y,z)
awk -F: 'gsub(/root/,"rockycai",$0) {print $0}' /etc/passwd //全局替換
awk -F: 'sub(/root/,"rockycai",$0) {print $0}' /etc/passwd //局部替換
3.length(z)
awk '{print length()}' /etc/passwd //顯示passwd每行長度
4.getline
df -h | awk 'BEGIN {print "Disk Free:"}{if(NF==1) {getline;print $3};if(NF==6) print $4}'