awk 自學練習

練習1

vim a.txt

Red Hat Enterprise Linux Version 5.3
Get the latest news about the world's Open Source Leader
Red Hat Network
Manage your system dffectively through Red Hat Network
Global Learning Services
You've got Red Hat Enterprise Linux,now get the skills
check out Red Hat's training courses and industry-acclaimed
#This is a test456 line
   space test123 line234


1.編寫一個awk腳本,功能是打印所有行
2.編寫一個awk腳本,打印文件第八行
3.用awk命令打印文件所有行的第一個字段
4.打印輸入行總數
5.打印每行字段數
6.打印最後一行
7.打印字段數多於4個的行
8.打印文件所有字段的總數
9.打印3-8行
10.在文件頂部加上標題“Document”
11.隔行刪除(1,3,5,...行刪除)
12.查找system替換成***SYSTEM***
14.打印一列數字的總和。
1.編寫一個awk腳本,功能是打印所有行
awk '{print $0}' a.txt 

2.編寫一個awk腳本,打印輸入文件第八行
awk '{if(NR==8){print $0}}' a.txt

3.用awk命令打印文件所有行的第一個字段
awk '{print $1}' a.txt 

4.打印輸入行總數
[root@slavedb test]# awk 'END{print NR}' a.txt 

5.打印每行字段數
awk '{print NF}' a.txt

6.打印最後一行
awk '{tail=$0}END{print tail}' a.txt 
awk 'END{print $0}' a.txt

7.打印字段數多於4個的行
awk '{if(NR>4){print $0}}' a.txt
awk 'NR>4' a.txt

8.打印文件所有字段的總數
awk 'BEGIN{n=0}{n=n+NF}END{print n}' a.txt

9.打印3-8行
awk 'NR>=3 && NR<=8' 1.txt
awk '{ if(NR>=3 && NR<=8){print} }' a.txt

10.在文件頂部加上標題“Document”
awk 'BEGIN{print "Document"}{print}' a.txt

11.隔行刪除(1,3,5,...行刪除)
awk '{ if(NR%2 == 0){print $0} }' a.txt

12.查找system替換成***SYSTEM***
awk '{gsub(/system/,"****SYSTEM****",$0);  print $0}' a.txt

13.取ifconfig eth0 的IP
ifconfig eth0 | awk '/inet /{print $2,$NF}' | awk -F"[ :]" '{print $2"/"$NF}'

14.打印一列數字的總和。
seq 100 | awk '{sum+=$1}END{print sum}'

練習2


1. sed和awk有什麼區別?
(1)awk:按列(域)操作;sed:按行操作
(2)awk:文本處理語言,適合對文本進行抽取處理;sed:非交互式的編輯器,適合對文本進行編輯

2. awk要處理域的時候,以哪個參數作爲分割參數?
-F
 
3. 請打印出/etc/passwd 第一個域,並且在第一個域所有的內容前面加上“用戶帳號:”
# cat /etc/passwd |awk -F: '{print"用戶帳號:"$1}'

4. 請打印出/etc/passwd 第三個域和第四個域
# awk -F: '{print $3"\t"$4}' /etc/passwd

5. 匹配/etc/passwd 第三域大於100的顯示出完整信息
# cat /etc/passwd |awk -F: '{if($3>100) print$0}'

6. 請打印第一域,並且打印頭部信息爲:這個是系統用戶,打印尾部信息爲:"================"
# cat /etc/passwd |awk -F: 'BEGIN{print "這個是系統用戶"} {print $1} END{print "================"}'

7. 打印行號小於15的,並且最後一域匹配bash的信息.
# cat /etc/passwd |awk -F: '{if($NR<15 && $NF~/bash/) print$0}'

8. 請打印出第一域匹配daemon的信息.
# cat /etc/passwd |awk -F: '$1=="daemon"'

10. 請打印出第三域數字之和
# cat /etc/passwd |awk -F: '{sum=sum+$3}END{print sum}'
# cat /etc/passwd |awk -F: '{sum=sum+$3};END{print sum}'

11. 請將/etc/passwd 中的root替換成gongda,記住是臨時替換輸出屏幕看到效果即可.
# cat /etc/passwd |awk -F: 'gsub(/root/,"gongda") {print $0}'

12. 請匹配passwd最後一段域bash結尾的信息,有多少條
# awk -F: '($NF~/bash/){print NR}' /etc/passwd |wc -l
# cat /etc/passwd |awk -F: '{if($NF~/bash/) print$0}'|wc -l
13. 請同時匹配passwd文件中,帶mail和bash的關鍵字的信息
# cat /etc/passwd |awk -F: '$0~/root|mail/'
# awk -F: '{if($0~/mail/ || $0~/bash/) print $0}' /etc/passwd

14. 請匹配passwd第三域總大於500的相關信息.
# cat /etc/passwd |awk -F: '{if($3>500) print $0}'
 
15.編寫文件file的內容如下:
Mike Harrington:[510] 548-1278:250:100:175
Christian Dobbins:[408] 538-2358:155:90:201
Susan Dalsass:[206] 654-6279:250:60:50
Archie McNichol:[206] 548-1348:250:100:175
Jody Savage:[206] 548-1278:15:188:150
Guy Quigley:[916] 343-6410:250:100:175
Dan Savage:[406] 298-7744:450:300:275
Nancy McNeil:[206] 548-1278:250:80:75
John Goldenrod:[916] 348-4278:250:100:175
Chet Main:[510] 548-5258:50:95:135
Tom Savage:[408] 926-3456:250:168:200
Elizabeth Stachelin:[916] 440-1763:175:75:300
其中:
Mike Harrington 名字
[510] 548-1278  電話
250:100:175     過去三個月裏的捐款

(1)顯示所有電話號碼
# awk -F: '{print $2}' file

(2)顯示Dan的電話號碼
# awk -F: '{if($1~/Dan/) print$2}' file 

(3)顯示Susan的名字和電話號碼
# awk -F: '{if($1~/Susan/) print$1,$2}' file 

(4)顯示所有以D開頭的姓
# awk -F: '{if($1~/^D/) print$1}' file 

(5)顯示所有以一個C或E開頭的名
# awk -F: '{if($1~/^[C|E]/) print$1}' file

(6)顯示所有隻有四個字符的名,這裏可以使用length函數,舉例: length($1)==10 $1字符爲10
# cat file |awk -F: '{print$1}'|awk '{if(length($1)==4) print $1}'

(7)顯示所有區號爲916的人名
# cat file |awk '{print$2}'|awk -F: '{if($2~/916/) print$1}'

(8)顯示Mike的捐款.顯示每個值時都有以$開頭.如$250$100$175
# cat file |awk -F: '{if($1~/Mike/) print "$"$3"$"$4"$"$5}'

(9)顯示姓,其後跟一個逗號和名
# cat file |awk -F: '{print$1}'|awk '{print$2","$1}'

練習3 – 排序例子


@@@@
【awk 之 asort 與 asorti 數組排序區別及演示-ontherd-ChinaUnix博客】
http://m.blog.chinaunix.net/uid-21374062-id-3189744.html

比如你有以下文件infile:
a,b,c,d,e,f
a,e,c,d,e,f
a,e,g,d,e,f
a,f,c,d,e,f
a,a,c,d,e,f
你想按第二列進行排序:
awk 'BEGIN{
    FS=","
}
{
    ary[$2,NR]=$0
}
END{
    nrw=asorti(ary, newary)
    for(i=1;i<=nrw;i++)
        print ary[newary[i]]
}' inputfile
a,a,c,d,e,f
a,b,c,d,e,f
a,e,c,d,e,f
a,e,g,d,e,f
a,f,c,d,e,f
@@@@
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章