1. 程式人生 > >linux 三劍客之awk

linux 三劍客之awk

eth0 組合 輸出 出現 不存在 數據類型 block $1 lse

#AWK命令

基礎顯示

打印install.log文件中包含data字段行的第二區域

awk ‘/data/ {print $2}’ install.log

查看num10.txt的第一行

head -n 1 num10.txt
結果:10

cat !$  #cat上次打開的文件,cat num10.txt

awk只顯示第一行:

NR number of row 第幾行

AWK讀取文件是一行一行讀取;

awk ‘NR==1‘ num10.txt
結果:10

awk打印最後一行:

awk ‘END{print $0}‘ num10.txt
結果: 1 最後一行

顯示最後一列:

NF number of fields 列

awk -F ‘ ‘ ‘{print $NF}‘ qqq
結果:
lll
222

不顯示第一行

awk ‘NR != 1‘ num10.txt

不顯示最後一列

awk -F ‘ ‘ ‘BEGIN{OFS="---"}{print $1,$2,$3}‘ qqq  
結果:
123---123---c
1fsda---ddd3---222

ORS,默認每一行結束之後是換行符

awk -F " " ‘BEGIN{OFS="";ORS=""}{for(i = 1;i < NF; i++){print $i" "}{printf "\n"}}‘ qqq   
123 123 c 
1fsda ddd3 222 

基礎運算

突然想起用python解決,來兩個實例~

現在有文件qqq,內容如下:

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7

實例1:(求每行的和)
with open("qqq") as f:
    j = 0
    for line in f:  # line 是字符串數據類型。
        li = line.strip().split()  # split生成列表數據
        sum = 0
        for i in li:
            sum += int(i)
            # print(line,sum)
        j += 1
        print(j,sum)
結果:
1 15
2 20
3 25

實例2:(求所有值的和)
with open("qqq") as f:
    sum = 0
    for line in f:  # line 是字符串數據類型。
        li = line.strip().split()  #split生成列表數據
        for i in li:
            sum += int(i)
    print(sum)
結果:
60

字符匹配

現在有文件grade,內容如下:

john 10 3  78 94 88
andrea 20 90 75 90 86
jasper 90 450 90 92 84
sun 60 50 80 98 87

打印第一列為sun的行

awk  ‘{if($1 == "sun")print $0}‘ grade
結果:
sun 60 50 80 98 87

打印第一列長度大於4,第二列大於40的行。

awk ‘{if (length($1) > 4 && $2 > 40) print $0}‘ grade
jasper 90 450 90 92 84

awk 不指定-F,就是默認空格或者table來分割。

正則匹配: ~

awk  ‘{if($1 ~ "su")print $0}‘ grade
結果:
sun 60 50 80 98 87

11. 匹配noarch字段,如果有,則顯示整行
$awk ‘$2 ~ /noarch/’ install.log
12. 匹配不存在noarch字段的行,如果有,
則顯示整行
$awk ‘$2 !~ /noarch/’ install.log

流程控制

兩個單引號之間可以有多個{},if語句示例如下

示例1: /etc/passwd 把root改成admin,別的是common user的列表。

awk -F: ‘{
if ($1 == "root")
    printf "%-15s: %s\n", $1,"Admin"
else
    print "%-15s: %s\n", $1,"Common User"
}‘ /etc/passwd  

示例2:有多少個普通用戶,UID > 1000

awk -F: -v sum=0 ‘{    # sum=0  這裏不能有空格
if ($3 > 1000)
  sum++
}END{
  print sum  
}‘  /etc/passwd
結果:
47

流程如下、

if流程

If
‘{if(條件){action}}‘

for 流程

for
‘{for (條件) {action}}‘

練習:打印最後一列小於等於6的所有行/他的值(還是用python吧。。。。)

with open("qqq") as f:
    for line in f:
        print(line.strip(),type(line.strip()))  # line in f 中 line 是字符串,strip()去掉換行符。
        li = line.strip().split()
        a = int(li[-1])
        if a > 6:
            pass
            # print(line)
            # print(a)
        else:
            pass
結果:
1 2 3 4 5 <class ‘str‘>
2 3 4 5 6 <class ‘str‘>
3 4 5 6 7 <class ‘str‘>

awk ‘{if ($NF <= 6) print $0}‘ qqq  #AWK一條命令解決

--------------------------------------


AWK命令格式

awk 指令是由模式,動作,或者模式和動作的組合組成。

‘pattern {action}‘

pattern 即模式,也可以理解為條件,你要找誰,高矮,胖瘦,等,都是條件。
action:即動作,可以理解為幹啥,找到人之後你要幹嘛

AWK執行過程

a) awk屈辱第一行內容
b) 判斷是否符合模式中得條件,匹配則執行action,不匹配,繼續讀取下一行
c) 繼續讀取下一行
d) 直到讀取到最後一行(EOF end of file)

域與記錄詳解

field 域,區域,字段 $1,$2等,表示第一個字段,第二個字段等。

record 記錄,可以理解為一整行

內置變量:
RS == record seperator 即行得分隔符
NR == number of record 行號
ORS == output record seperator 輸出時候得分隔符

awk得正則匹配

^cool 匹配所有以cool開頭得字符串
cool$ 匹配所有以cool結尾得字符串
a+b 匹配一個或多個a 加上b得行


ifconfig eth0 |awk -F "[ :]+" ‘NR==2 {print $3 }‘
ifconfig eth0 | awk -F "netmask|broadcast" ‘NR==2{print $3}‘

怎麽匹配1,不匹配到11:
awk --posix -F: ‘$3~/1{2,}/{print $0}‘ test.awk    出現兩次得可以出來,寫成{1,} 也還是都出來了

awk -F: ‘$3~/\<1\>/{print $0}‘ test.awk  
\< 或 \b:詞首錨定;用於單詞模式的左側;
\> 或 \b:詞尾錨定;用於單詞模式的右側;
\<PATTERN\>:匹配整個單詞;

netstat -lantp | awk -F "[:/ ]+" ‘{print $5,"\t",$10}‘| sort 查詢服務得端口

BEGIN和END模塊詳解

找空行:
grep -c ‘^$‘ test.awk
awk -v a=0 ‘/^$/{a=a+1}END{print a}‘ test.awk

awk -v a=0 -F: ‘$3>=5{a=a+1;(用;號分割)print a(a++)}END{print a}‘ test.awk

linux 三劍客之awk