Linux之awk:按照字符或列进行筛选与计算列值 条件动作
生活随笔
收集整理的這篇文章主要介紹了
Linux之awk:按照字符或列进行筛选与计算列值 条件动作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 語法
awk '條件1{動作1} 條件2{動作2}...'文件名條件(Pattern):一般使用關系表達式作為條件--x > 10判斷變量x是否大于10 動作(Action):格式化輸出流程 --控制語句1.1條件?
1.1.1BEGIN與AFTER
[root@localhost ~]# awk 'BEGIN{printf "This is a transcript \n" } {printf $2 "\t" $6 "\n"}' student.txt #awk命令只要檢測不到完整的單引號不會執行,所以這個命令的換行不用加入“\”,就是一行命令 #這里定義了兩個動作 #第一個動作使用BEGIN條件,所以會在讀入文件數據前打印“這是一張成績單”(只會執行一次)第二個 動作會打印文件的第二字段和第六字段[root@localhost ~]# awk 'END{printf "The End \n" } {printf $2 "\t" $6 "\n"}' student.txt #在輸出結尾輸入“The End”,這并不是文檔本身的內容,而且只會執行一次1.1.2關系運算符
假設我想看看平均成績大于等于87分的學員是誰,就可以這樣輸入命令:例子1: [root@localhost string]# cat student.txt id name esex makr 1 qq aa 34 2 xx cc 45 3 tt vv 55 [root@localhost string]# cat student.txt | grep -v name | awk '$4 >= 40 {printf $2 "\n" }' xx tt [root@localhost ~]# awk '$2 ~ /Sc/ {printf $6 "\n"}' student.txt #如果第二字段中輸入包含有“Sc”字符,則打印第六字段數據85.66這里要注意在awk中,使用“//”包含的字符 串,awk命令才會查找。也就是說字符串必須用“//”包含,awk命令才能正確識別。 ~ 和 !~ 匹配正則表達式和不匹配正則表達式 有$的話 必須使用~ 進行正則匹配1.1.3正則表達式
如果要想讓awk識別字符串,必須使用“//”包含,例如:例子1: [root@localhost ~]# awk '/Liming/ {print}' student.txt #打印Liming的成績 當使用df命令查看分區使用情況是,如果我只想查看真正的系統分區的使用狀況,而不想查看光盤和臨時分區 的使用狀況,則可以:例子2: [root@localhost ~]# df -h | awk '/sda[0-9]/ {printf $1 "\t" $5 "\n"} ' #查詢包含有sda數字的行,并打印第一字段和第五字段1.2awk內置變量?
[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}' [root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | \awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\t 行號:" NR "\t 字段數:" NF "\n"}' #解釋下awk命令 #開始執行{分隔符是“:”} {輸出第一字段和第三字段輸出行號(NR值)字段數(NF值)} root 0 行號:1 字段數:7 user1 501 行號:2 字段數:7如果我只想看看sshd這個偽用戶的相關信息,則可以這樣使用: [root@localhost ~]# cat /etc/passwd | awk 'BEGIN {FS=":"} $1=="sshd" {printf $1 "\t" $3 "\t 行號:"NR "\t 字段數:"F " \n"}' #可以看到sshd偽用戶的UID是74,是/etc/passwd文件的第28行,此行有7個字段1.3awk流程控制
加和
[root@localhost ~]# awk 'NR==2{php1=$3} NR==3{php2=$3} NR==4{php3=$3;totle=php1+php2+php3;print "totle php is " totle}' student.txt #統計PHP成績的總分我們解釋下這個命令。“NR==2{php1=$3}”(條件是NR==2,動作是php1=$3)這句話是指如果輸入數據是第二行 (第一行是標題行),就把第二行的第三字段的值賦予變量“php1”。“NR==3{php2=$3}”這句話是指如果輸入數 據是第三行,就把第三行的第三字段的值賦予變量“php2”。“NR==4{php3=$3;totle=php1+php2+php3;print "totle php is " totle}”(“NR==4”是條件,后面{}中的都是動作)這句話是指如果輸入數據是第四行,就把 第四行的第三字段的值賦予變量“php3”;然后定義變量totle的值是“php1+php2+php3”;然后輸出“totle php is”關鍵字,后面加變量totle的值。if與賦值?
假設如果Linux成績大于90,就是一個好男人[root@localhost ~]# awk '{if (NR>=2) {if ($4>90) printf $2 " is a good man!\n"}}' student.txt #程序中有兩個if判斷,第一個判斷行號大于2,第二個判斷Linux成績大于90分Liming is a good man!Sc is a good man![root@localhost ~]# awk ' NR>=2 {test=$4} test>90 {printf $2 " is a good man!\n"}' student.txt #先判斷行號如果大于2,就把第四字段賦予變量test #在判斷如果test的值大于90分,就打印好男人Liming is a good man!Sc is a good man!自定義函數
[root@localhost string]# awk 'function test(a,b) { printf a "\t" b "\n" } { test($2,$3) }' student.txt name esex qq aa xx cc tt vv調用腳本-f
[root@localhost ~]# vi pass.awkBEGIN {FS=":"}{ print $1 "\t" $3}[root@localhost ~]# awk -f pass.awk /etc/passwd root 0 bin 1 daemon 2例子
統計日志中INFO,ERROR出現的總數,以及總記錄數awk ' BEGIN {FS="@" }{if ($3 == "INFO") {info_count++}if ($3 == "ERROR") {error_count++}}END {print "order total count:"NR printf("INFO count:%d ERROR count:%d\n",info_count,error_count) } ' demo.log_after_sortorder total count:22 INFO count:5 ERROR count:17?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Linux之awk:按照字符或列进行筛选与计算列值 条件动作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浙江省杭州市拱墅区石桥路上小学没有租房备
- 下一篇: 汝城芙蓉学校附近有没有三房出租的?