#正規表示式的一些最基本的東西:
^ 表示一行的開頭。如:/^#/ 以#開頭的匹配。
$ 表示一行的結尾。如:/}$/ 以}結尾的匹配。
\< 表示詞首。 如:\表示詞尾。 如:abc\> 表示以 abc 結尾的詞。
. 表示任何單個字元。
* 表示某個字元出現了0次或多次。
[ ] 字元集合。 如:[abc] 表示匹配a或b或c,
還有 [a-za-z] 表示匹配所有的26個字元。
如果其中有^表示反,如 [^a] 表示非a的字元
awk 把檔案逐行的讀入,以空格(可以指定)為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk 是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。
awk ''
# 匹配 動作
#示例
awk '
' file #檔案第一列,預設分隔符是"空白鍵" 或 "[tab]鍵"
awk -f ':' '
' file #-f 指定域分隔符為':'
awk -f ':' 'begin
end '
#先執行beging,然後讀取檔案,直到所有的記錄都讀完,最後執行end操作。
#如果你要指定多個分隔符,你可以這樣來:
awk -f '[;:]'
awk -f: '/root/' file #包含root的行
awk -f: '/root/
' /etc/passwd #顯示匹配上的第7列
$0當前記錄(這個變數中存放著整個行的內容)$1~
$n當前記錄的第n個字段,欄位間由fs分隔
fs 輸入字段分隔符 預設是空格或tab
rs 輸入的記錄分隔符, 預設為換行符
nf 當前記錄中的字段個數,就是有多少列
nr 已經讀出的記錄數,就是行號,從
1開始,如果有多個檔案話,這個值也是不斷累加中。
fnr 當前記錄數,與nr不同的是,這個值會是各個檔案自己的行號
ofs 輸出字段分隔符, 預設也是空格
ors 輸出的記錄分隔符,預設為換行符
filename 當前輸入檔案的名字
#awk 內建變數
argc 命令列引數個數
argv 命令列引數排列
environ 支援佇列中系統環境變數的使用
filename awk瀏覽的檔名
fnr 瀏覽檔案的記錄數
fs 設定輸入域分隔符,等價 -f選項
nf 瀏覽記錄的域的個數
nr 已讀的記錄數
ofs 輸出域分隔符
ors 輸出記錄分隔符
rs 控制記錄分隔符
$0變數是指整條記錄
$1表示當前行的第乙個域
$2表示當前行的第二個域
print函式的引數可以是變數、數值或者字串。字串必須用雙引號引用,引數用逗號分隔。如果沒有逗號,引數就串聯在一起而無法區分。這裡,逗號的作用與輸出檔案的分隔符的作用是一樣的,只是後者是空格而已。
printf函式,其用法和c語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,**更易懂。
$ awk '
' netstat.txt
proto recv-q send-q local-address foreign-address state
tcp 00
0.0.0.0:
3306
0.0.0
.0:* listen
tcp 00
0.0.0.0:
800.0
.0.0
:* listen
tcp 00
127.0
.0.1
:9000
0.0.0
.0:* listen
#awk程式設計
##過濾記錄####
#我們再來看看如何過濾記錄
#(下面過濾條件為:第三列的值為0 && 第6列的值為listen)
awk '
$3==
0&&
$6=="listen" ' netstat.txt
#第一行作為表頭,我們可以引入內建變數nr:
awk '
$3==
0&&
$6=="listen" || nr==
1' netstat.txt
#格式化輸出
awk '
$3==
0&&
$6=="listen" || nr==
1' netstat.txt
#以\t作為分隔符輸出的例子(下面使用了/etc/passwd檔案,這個檔案是以:分隔的):
awk -f: '
' ofs="\t" /etc/passwd
### 字串匹配
awk '
$6~ /fin/ || nr==
1' ofs="\t" netstat.txt
1local-address foreign-address state
6coolshell.cn:
8061.140
.101
.185
:37538
fin_wait2
9coolshell.cn:
80116.234
.127
.77:
11502
fin_wait2
#匹配fin狀態。
#其實 ~ 表示模式開始。/ /中是模式。這就是乙個正規表示式的匹配。
awk '
$6~ /fin|time/ || nr==
1' ofs="\t" netstat.txt
#匹配fin 或者 time
awk '/listen/' netstat.txt
#其實awk可以像grep一樣的去匹配第一行
#模式取反的例子:
awk '
$6!~ /wait/ || nr==
1' ofs="\t" netstat.txt
## 折分檔案
#awk拆分檔案很簡單,使用重定向就好了。下面這個例子,
#是按第6例分隔檔案,相當的簡單(其中的nr!=1表示不處理表頭)。
awk 'nr!=
1' netstat.txt
#資料夾下會生成以第六列的變數為名字的檔案
#再複雜一點:(注意其中的if-else-if語句,可見awk其實是個指令碼直譯器)
awk 'nr!=
1' netstat.txt
shell awk 統計重複個數
有檔案file.log內容如下 要統每個網域名稱出現次數 4 2 1 答案是 awk f end file.log 解釋一下,awk語法就不說了 f引數是制定awk分隔符,這裡制定的是 所以每行被分成4個部分。sort 的 r是降序,k是按照第幾組字元排序,從1開始。a可以理解成key value形...
關於shell awk 的學習
正所謂,知己知彼百戰不殆,想要拿下awk,必需了解它的前世今生 一 它可以做什麼 1 awk 是一種程式語言,可以用作linux或者unix的bash指令碼中 也可以單獨放在乙個檔案中,通過awk命令直譯器執行 這裡只關注awk用作bash指令碼中 2 awk 主要功能是,基於指定的規則,對文字或者...
shell AWK舉個小例子
這個世界最難的不是做什麼,而是找什麼?李清照的 尋尋覓覓 最後把自己尋覓沒了。仿古人,俺也尋尋覓覓了一陣子,結果跟清照大姐一樣,迷失在尋尋覓覓中,到現在都不知道我在尋覓什麼?個人認為找什麼不是體力活,而是技術活。awk吸引我的,也就是它教會了我怎麼找我想要的東西?準備乾糧 root localhos...