婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux中awk的使用方法詳解

Linux中awk的使用方法詳解

熱門標簽:400電話號碼辦理多少錢 虛假地圖標注 地圖標注黃河的位置 承德地圖標注公司 濮陽好的聯通400電話申請 地圖標注如何改成微信號 山東企業外呼系統公司 靈圖uu電子寵物店地圖標注 百度地圖標注公司位置要多少錢

在學習awk之前我們應該都學過sed,grep,tr,cut等等命令,這些命令都是為了方便我們對Linux下文本和數據的處理,但是我們會發現很多時候這些命令并不能一下子就完全解決我們的需求,很多時候我們都需要使用管道符結合這些命令來使用,今天我就給大家介紹一個命令awk,他就能很好的解決我們對文本和數據處理的需求,使我們一條命令就解決很多問題。

一、awk命令簡介

awk被稱為文本處理三劍客之一,其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言 , 三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。
所以說awk是一個強大的文本分析工具,相對于grep的查找,sed的編輯,awk在其對數據分析并生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各種分析處理。

二、awk命令格式及選項

語法形式

awk [options] 'script' var=value file(s)
awk [options] -f scriptfile var=value file(s)

常用命令選項

-F fs fs指定輸入分隔符,fs可以是字符串或正則表達式,如-F:
-v var=value 賦值一個用戶定義變量,將外部變量傳遞給awk
-f scripfile 從腳本文件中讀取awk命令
-m[fr] val 對val值設置內在限制,-mf選項限制分配給val的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。

三、awk的原理

awk 'BEGIN{ commands } pattern{ commands } END{ commands }'

第一步:執行BEGIN{ commands }語句塊中的語句;
第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最后一行重復這個過程,直到文件全部被讀取完畢。
第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。
BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。

END語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。

pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。

四、awk 基本用法

awk的調用有三種方式

1.命令行方式

awk [-F field-separator] 'commands' input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。

2.shell腳本方式

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

一個awk腳本通常由:BEGIN語句塊、能夠使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分都可以不出現在腳本中,腳本通常是被單引號或雙引號中,例如:

awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename
awk "BEGIN{ i=0 } { i++ } END{ print i }" filename

3.將所有的awk命令插入一個單獨文件,然后調用

awk -f awk-script-file input-file(s)

其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的命令行方式是一樣的。
我們通過幾個簡單的示例來進一步了解awk的用法

[root@localhost ~]# awk '{print $0}' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
.........................................................................
[root@localhost ~]# echo 123|awk '{print "hello,awk"}'
hello,awk

[root@localhost ~]# awk '{print "hi"}' /etc/passwd
hi
hi
hi
hi
hi
hi
hi
hi
hi
.........................................................................


我們指定/etc/passwd作為輸出文件,執行awk時,它就會依次對/etc/passwd中的每一行執行print命令。

awk工作流程是這樣的:讀入有'\n'換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。默認域分隔符是"空白鍵" 或 "[tab]鍵",所以$1表示登錄用戶,$3表示登錄用戶ip,以此類推。如

打印/etc/passwd下所有的用戶名

[root@localhost ~]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm

........................................................................
打印/etc/passwd下所有的用戶名及UID

[root@localhost ~]# awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2

........................................................................
以username: XXX  uid: XXX格式輸出

[root@localhost ~]# awk -F: '{print "username: " $1 "\t\tuid: "$3}' /etc/passwd
username: root   uid: 0
username: bin    uid: 1
username: daemon    uid: 2
........................................................................


五、awk內置變量

變量 描述
\$n 當前記錄的第n個字段,字段間由FS分隔
\$0 完整的輸入記錄
ARGC 命令行參數的數目
ARGIND 命令行中當前文件的位置(從0開始算)
ARGV 包含命令行參數的數組
CONVFMT 數字轉換格式(默認值為%.6g)ENVIRON環境變量關聯數組
ERRNO 最后一個系統錯誤的描述
FIELDWIDTHS 字段寬度列表(用空格鍵分隔)
FILENAME 當前文件名
FNR 各文件分別計數的行號
FS 字段分隔符(默認是任何空格)
IGNORECASE 如果為真,則進行忽略大小寫的匹配
NF 一條記錄的字段的數目
NR 已經讀出的記錄數,就是行號,從1開始
OFMT 數字的輸出格式(默認值是%.6g)
OFS 輸出記錄分隔符(輸出換行符),輸出時用指定的符號代替換行符
ORS 輸出記錄分隔符(默認值是一個換行符)
RLENGTH 由match函數所匹配的字符串的長度
RS 記錄分隔符(默認是一個換行符)
RSTART 由match函數所匹配的字符串的第一個位置
SUBSEP 數組下標分隔符(默認值是/034)

示例

[root@localhost ~]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{print "Line No:"NR", No of fields:"NF, "$0="$0, "$1="$1, "$2="$2, "$3="$3}'
Line No:1, No of fields:3 $0=line1 f2 f3 $1=line1 $2=f2 $3=f3
Line No:2, No of fields:3 $0=line2 f4 f5 $1=line2 $2=f4 $3=f5
Line No:3, No of fields:3 $0=line3 f6 f7 $1=line3 $2=f6 $3=f7

使用print $NF可以打印出一行中的最后一個字段,使用$(NF-1)則是打印倒數第二個字段,其他以此類推:

[root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $NF}'
f3
f5
[root@localhost ~]# echo -e "line1 f2 f3\n line2 f4 f5" | awk '{print $(NF-1)}'
f2
f4

統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:

[root@localhost ~]# awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin

統計/etc/passwd文件中的命令行參數ARGC,文件行號FNR,字段分隔符FS,一條記錄的字段數目NF,已經讀出的記錄數(默認是行號)NR

[root@localhost ~]# awk -F: 'BEGIN{printf "%4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR}' /etc/passwd
FILENAME ARGC FNR  FS  NF  NR
---------------------------------------------
/etc/passwd  2  1  :  7  1
/etc/passwd  2  2  :  7  2
/etc/passwd  2  3  :  7  3


六、awk高級用法

1.awk賦值運算

賦值語句運算符:= += -= *= /= %= ^= **=

例如:a+=5;等價于a=a+5

[root@localhost ~]# awk 'BEGIN{a=5;a+=5;print a}'
10

2.awk正則運算
輸出包含有root的行,并打印用戶名和UID及原行內容

[root@localhost ~]# awk -F: '/root/ {print $1,$3,$0}' /etc/passwd
root 0 root:x:0:0:root:/root:/bin/bash
operator 11 operator:x:11:0:operator:/root:/sbin/nologin

我們發現找到了兩行,如果我們想找root開頭的行就要這樣寫:awk -F: '/^root/' /etc/passwd

3.awk三目運算

[root@localhost ~]# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[root@localhost ~]# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err

三目運算其實就是一個判斷運算,如果為真則輸出?后的內容,如果為假則輸出:后的內容

4.awk的循環運用

if語句運用

[root@localhost ~]# awk 'BEGIN{ test=100;if(test>90){ print "vear good";} else{print "no pass";}}'
vear good

每條命令后用;結尾
while循環運用
計算從1累加到100的值

[root@localhost ~]# awk 'BEGIN{test=100;num=0;while(i<=test){num+=i; i++;}print num;}'
5050
for循環的運用
[root@localhost ~]# awk 'BEGIN{test=0;for(i=0;i<=100;i++){test+=i;}print test;}'
5050
do循環的運用
[root@localhost ~]# awk 'BEGIN{test=0;i=0;do{test+=i;i++}while(i<=100)print test;}'
5050

5.awk的數組運用

數組是awk的靈魂,處理文本中最不能少的就是它的數組處理。因為數組索引(下標)可以是數字和字符串在awk中數組叫做關聯數組(associative arrays)。awk 中的數組不必提前聲明,也不必聲明大小。數組元素用0或空字符串來初始化,這根據上下文而定。一般而言,awk中的數組用來從記錄中收集信息,可以用于計算總和、統計單詞以及跟蹤模板被匹配的次數等等。
顯示/etc/passwd的賬戶

awk -F: 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
0 root
1 bin
2 daemon
3 adm
4 lp
5 sync
........................................................................


6.awk字符串函數的運用

函數名 描述
sub 匹配記錄中最大、最靠左邊的子字符串的正則表達式,并用替換字符串替換這些字符串。如果沒有指定目標字符串就默認使用整個記錄。替換只發生在第一次匹配的 時候
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)

實例:

     awk '{ sub(/test/, "mytest"); print }' testfile
     awk '{ sub(/test/, "mytest"); $1}; print }' testfile

第一個例子在整個記錄中匹配,替換只發生在第一次匹配發生的時候。如要在整個文件中進行匹配需要用到gsub

第二個例子在整個記錄的第一個域中進行匹配,替換只發生在第一次匹配發生的時候。
gsub 整個文檔中進行匹配
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)

實例:

     awk '{ gsub(/test/, "mytest"); print }' testfile
     awk '{ gsub(/test/, "mytest" , $1) }; print }' testfile

第一個例子在整個文檔中匹配test,匹配的都被替換成mytest。

第二個例子在整個文檔的第一個域中匹配,所有匹配的都被替換成mytest。
index 返回子字符串第一次被匹配的位置,偏移量從位置1開始
index(string, substring)

實例:

         awk '{ print index("test", "mytest") }' testfile

實例返回test在mytest的位置,結果應該是3。
substr 返回從位置1開始的子字符串,如果指定長度超過實際長度,就返回整個字符串
substr( string, starting position )
substr( string, starting position, length of string )

實例:

         awk '{ print substr( "hello world", 7,11 ) }'

上例截取了world子字符串。
split 可按給定的分隔符把字符串分割為一個數組。如果分隔符沒提供,則按當前FS值進行分割
split( string, array, field separator )
split( string, array )

實例:

         awk '{ split( "20:18:00", time, ":" ); print time[2] }'

上例把時間按冒號分割到time數組內,并顯示第二個數組元素18。
length 返回記錄的字符數
length( string )
length

實例:

     awk '{ print length( "test" ) }' 
     awk '{ print length }' testfile


第一個實例返回test字符串的長度。

第二個實例返回testfile文件中第條記錄的字符數。
match 返回在字符串中正則表達式位置的索引,如果找不到指定的正則表達式則返回0。match函數會設置內建變量RSTART為字符串中子字符串的開始位 置,RLENGTH為到子字符串末尾的字符個數。substr可利于這些變量來截取字符串

match( string, regular expression )

實例:

     awk '{start=match("this is a test",/[a-z]+$/); print start}'
     awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'


第一個實例打印以連續小寫字符結尾的開始位置,這里是11。

第二個實例還打印RSTART和RLENGTH變量,這里是11(start),11(RSTART),4(RLENGTH)。
toupper和tolower 可用于字符串大小間的轉換,該功能只在gawk中有效

toupper( string )
tolower( string )

實例:

         awk '{ print toupper("test"), tolower("TEST") }'

標簽:安康 鷹潭 淮安 上海 泰安 德宏 樂山 福州

巨人網絡通訊聲明:本文標題《Linux中awk的使用方法詳解》,本文關鍵詞  Linux,中,awk,的,使用方法,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux中awk的使用方法詳解》相關的同類信息!
  • 本頁收集關于Linux中awk的使用方法詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人永久aaa| 亚洲成人在线观看视频| 国产精品中文字幕日韩精品| 中文字幕一区二区不卡| 精品理论电影在线观看 | 一本一道综合狠狠老| 亚洲三级久久久| 日韩欧美中文一区| 欧美人与禽zozo性伦| 色欧美乱欧美15图片| 成人91在线观看| 成人激情小说乱人伦| 极品少妇一区二区三区精品视频| 亚洲国产日韩在线一区模特 | 精品久久久三级丝袜| 欧美日韩中文字幕精品| 欧美久久一二区| 精品婷婷伊人一区三区三| 91精品1区2区| 欧美色图免费看| 欧美性一区二区| 欧美日本一区二区在线观看| 欧美高清dvd| 日韩欧美亚洲一区二区| 精品国产乱码久久久久久影片| 日韩精品一区二区三区四区 | 亚洲va欧美va国产va天堂影院| 一区二区三区日韩欧美| 亚洲成人一区二区在线观看| 三级久久三级久久| 精品一区二区免费在线观看| 国产激情精品久久久第一区二区 | 日韩高清不卡在线| 日日摸夜夜添夜夜添精品视频| 日本最新不卡在线| 韩国成人福利片在线播放| 国产剧情一区二区| 99国产精品久久久久久久久久| 色av综合在线| 精品久久一区二区| 亚洲精品一二三| 美女在线视频一区| 99热这里都是精品| 69av一区二区三区| 国产欧美视频在线观看| 亚洲国产一区在线观看| 极品少妇xxxx精品少妇偷拍| av爱爱亚洲一区| 日韩一级片在线观看| 国产香蕉久久精品综合网| 亚洲色图在线视频| 蜜臀久久99精品久久久久久9| 国产98色在线|日韩| 欧美日韩一二三| 亚洲精品在线观看视频| 一区二区三区中文字幕精品精品| 老司机精品视频导航| 91日韩精品一区| 亚洲精品一区二区三区蜜桃下载 | 91精彩视频在线观看| 精品噜噜噜噜久久久久久久久试看 | 首页欧美精品中文字幕| 国产福利一区二区三区视频| 欧美视频一区二区三区四区| 国产日韩欧美精品电影三级在线| 亚洲第一搞黄网站| 99国产精品99久久久久久| 欧美xxxxxxxxx| 午夜av区久久| 色系网站成人免费| 欧美激情一二三区| 美国十次综合导航| 欧美日韩精品一区二区| 亚洲欧美在线视频| 高清国产一区二区| 精品av久久707| 欧美aaa在线| 欧美日韩高清一区二区| 亚洲综合色婷婷| 一本一道综合狠狠老| 国产无遮挡一区二区三区毛片日本| 日韩电影在线观看电影| 欧美日韩你懂得| 亚洲不卡一区二区三区| 欧美伊人精品成人久久综合97| 亚洲欧洲色图综合| av在线播放成人| 18成人在线视频| 99久久国产免费看| 中文字幕一区二区在线观看| 成人理论电影网| 国产精品久久久久久久久动漫| 国产成人精品影视| 国产精品日产欧美久久久久| 本田岬高潮一区二区三区| 久久精品人人做人人综合 | 狠狠色丁香婷综合久久| 日韩欧美一级二级三级| 乱中年女人伦av一区二区| 制服丝袜成人动漫| 精品制服美女久久| 久久婷婷色综合| 成人手机电影网| 亚洲人成7777| 日本精品视频一区二区三区| 亚洲女与黑人做爰| heyzo一本久久综合| 色8久久精品久久久久久蜜| 亚洲欧美一区二区视频| 91在线国产观看| 亚洲综合在线视频| 91麻豆精品国产91久久久资源速度| 日韩中文字幕亚洲一区二区va在线| 欧美美女黄视频| 看片的网站亚洲| 久久久午夜精品| 91亚洲精华国产精华精华液| 一区二区三区在线免费| 欧美日韩国产综合视频在线观看| 青青草伊人久久| 国产日本一区二区| 91高清视频免费看| 免费成人av在线| 亚洲国产精品99久久久久久久久| 色av综合在线| 精品一区二区在线视频| 国产精品久久久久影院老司| 欧美日本在线一区| 懂色av一区二区三区免费观看| 亚洲蜜臀av乱码久久精品| 欧美一卡二卡三卡| 成人免费观看av| 日韩高清在线观看| 国产精品毛片久久久久久| 欧美高清你懂得| 成a人片亚洲日本久久| 视频一区二区国产| 国产精品日产欧美久久久久| 在线成人午夜影院| 成人91在线观看| 精品制服美女久久| 日韩理论片一区二区| 日韩精品一区二区三区swag| 在线精品视频一区二区三四| 国产精品一区二区免费不卡| 日韩成人伦理电影在线观看| 亚洲欧美综合另类在线卡通| 日韩欧美第一区| 欧美午夜电影网| 91无套直看片红桃| 国产69精品久久99不卡| 美女网站一区二区| 婷婷中文字幕一区三区| 亚洲男女毛片无遮挡| 国产日韩欧美一区二区三区综合 | 国产精品视频免费| 日韩美女视频在线| 欧美视频中文一区二区三区在线观看| 岛国av在线一区| 国产精品99久久久久| 久久99精品久久久| 日本亚洲免费观看| 亚洲sss视频在线视频| 中文字幕在线不卡一区| 国产午夜亚洲精品午夜鲁丝片| 精品欧美乱码久久久久久| 日韩丝袜美女视频| 亚洲一二三四在线观看| 欧美在线你懂的| 国产一区二区三区久久悠悠色av| 亚洲激情六月丁香| 最新中文字幕一区二区三区| 久久麻豆一区二区| 欧美美女一区二区三区| 国产91在线看| 国产一区二区导航在线播放| 日本aⅴ免费视频一区二区三区| 一区二区三区在线免费| 亚洲男人电影天堂| 一区二区三区不卡视频| 又紧又大又爽精品一区二区| 亚洲一区在线观看视频| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲日本va在线观看| 亚洲欧美日韩国产一区二区三区| 日韩美女视频一区二区| 伊人婷婷欧美激情| 亚洲一区视频在线| 午夜精品aaa| 六月丁香婷婷久久| 国产一区二区影院| 成人av电影在线网| 在线观看日韩精品| 日韩一区二区在线观看视频播放| 日韩午夜电影在线观看| 国产三级精品三级| 一区二区三区电影在线播| 午夜视频一区在线观看| 久久精品国产精品青草| 成人午夜av在线|