Linux——awk命令解析
awk簡介
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。
awk 是一種很棒的語言,它適合文字處理和報表生成,其語法較為常見,借鑑了某些語言的一些精華,如 C 語言等。在 linux 系統日常處理工作中,發揮很重要的作用,掌握了 awk將會使你的工作變的高大上。 awk 是三劍客的老大,利劍出鞘,必會不同凡響。
使用方法
1 |
awk
'{pattern + action}'
{filenames}
|
儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正則表示式,用斜槓括起來。
awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。完整的awk指令碼通常用來格式化文字檔案中的資訊。
通常,awk是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。
awk 的原理
通過一個簡短的命令,我們來了解其工作原理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[[email protected] scripts]
# awk '{print $0}' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
.....................................................
[[email protected] scripts]
# echo hhh|awk '{print "hello,world"}'
hello,world
[[email protected] scripts]
# awk '{print "hiya"}' /etc/passwd
hiya
hiya
hiya
hiya
...............................................
|
你將會見到/etc/passwd 檔案的內容出現在眼前。現在,解釋 awk 做了些什麼。呼叫 awk時,我們指定/etc/passwd 作為輸入檔案。執行 awk 時,它依次對/etc/passwd 中的每一行執行 print 命令。
所有輸出都發送到 stdout,所得到的結果與執行 cat /etc/passwd 完全相同。
現在,解釋{ print }程式碼塊。在 awk 中,花括號用於將幾塊程式碼組合到一起,這一點類似於 C 語言。在程式碼塊中只有一條 print 命令。在 awk 中,如果只出現 print 命令,那麼將列印當前行的全部內容。
再次說明, awk 對輸入檔案中的每一行都執行這個指令碼。
1 2 3 4 |
$
awk
-F
":"
'{ print $1 }'
/etc/passwd
$
awk
-F
":"
'{ print $1 $3 }'
/etc/passwd
$
awk
-F
":"
'{ print $1 " " $3 }'
/etc/passwd
$
awk
-F
":"
'{ print "username: " $1 "\t\tuid:" $3" }'
/etc/passwd
|
-F引數:指定分隔符,可指定一個或多個
print 後面做字串的拼接
下面通過幾例項來了解下awk的工作原理:
例項一:只檢視test.txt檔案(100行)內第20到第30行的內容(企業面試)
1 2 3 4 5 6 7 8 9 10 11 12 |
[[email protected] scripts]
# awk '{if(NR>=20 && NR<=30) print $1}' test.txt
20
21
22
23
24
25
26
27
28
29
30
|
例項二:已知test.txt檔案內容為:
1 2 |
[[email protected] scripts]
# cat test.txt
I am Poe,my qq is 33794712
|
請從該檔案中過濾出'Poe'字串與33794712,最後輸出的結果為:Poe 33794712
1 2 |
[[email protected] scripts]
# awk -F '[ ,]+' '{print $3" "$7}' test.txt
Poe 33794712
|
BEGIN 和 END 模組
通常,對於每個輸入行, awk 都會執行每個指令碼程式碼塊一次。然而,在許多程式設計情況中,可能需要在 awk 開始處理輸入檔案中的文字之前執行初始化程式碼。對於這種情況, awk 允許您定義一個 BEGIN 塊。
因為 awk 在開始處理輸入檔案之前會執行 BEGIN 塊,因此它是初始化 FS(欄位分隔符)變數、列印頁首或初始化其它在程式中以後會引用的全域性變數的極佳位置。
awk 還提供了另一個特殊塊,叫作 END 塊。 awk 在處理了輸入檔案中的所有行之後執行這個塊。通常, END 塊用於執行最終計算或列印應該出現在輸出流結尾的摘要資訊。
例項一:統計/etc/passwd的賬戶人數
1 2 3 4 |
[[email protected] scripts]
# awk '{count++;print $0;} END{print "user count is ",count}' passwd
root:x:0:0:root:
/root
:
/bin/bash
..............................................
user count is 27
|
count是自定義變數。之前的action{}裡都是隻有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:
1 2 3 4 5 |
[[email protected] scripts]
# awk 'BEGIN {count=0;print "[start] user count is ",count} {count=count+1;print $0} END{print "[end] user count is ",count}' passwd
[start] user count is 0
root:x:0:0:root:
/root
:
/bin/bash
...................................................................
[end] user count is 27
|
例項二:統計某個資料夾下的檔案佔用的位元組數
1 2 |
[[email protected] scripts]
# ll |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ",size}'
[end]size is 1489
|
如果以M為單位顯示:
1 2 |
[[email protected] scripts]
# ll |awk 'BEGIN{size=0;} {size=size+$5;} END{print "[end]size is ",size/1024/1024,"M"}'
[end]size is 0.00142002 M
|
awk運算子
awk 賦值運算子:a+5;等價於: a=a+5;其他同類
1 2 |
[[email protected] scripts]
# awk 'BEGIN{a=5;a+=5;print a}'
10
|
awk邏輯運算子:
1 2 |
[[email protected] scripts]
# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1
|
判斷表示式 a>2&&b>1為真還是為假,後面的表示式同理
awk正則運算子:
1 2 |
[[email protected] scripts]
# awk 'BEGIN{a="100testaa";if(a~/100/) {print "ok"}}'
ok
|
1 2 |
[[email protected] scripts]
# echo|awk 'BEGIN{a="100testaaa"}a~/test/{print "ok"}'
ok
|
關係運算符:
如: > < 可以作為字串比較,也可以用作數值比較,關鍵看運算元如果是字串就會轉換為字串比較。兩個都為數字 才轉為數值比較。字串比較:按照ascii碼順序比較。
1 2 3 4 5 |
[[email protected] scripts]
# awk 'BEGIN{a="11";if(a>=9){print "ok"}}' #無輸出
[[email protected] scripts]
# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
ok
[[email protected] scripts]
# awk 'BEGIN{a;if(a>=b){print "ok"}}'
ok
|
awk 算術運算子:
說明,所有用作算術運算子進行操作,運算元自動轉為數值,所有非數值都變為0。
1 2 3 4 |
[[email protected] scripts]
# awk 'BEGIN{a="b";print a++,++a}'
0 2
[[email protected] scripts]
# awk 'BEGIN{a="20b4";print a++,++a}'
20 22
|
這裡的a++ , ++a與javascript語言一樣:a++是先賦值加++;++a是先++再賦值
三目運算子 ?:
1 2 3 4 |
[[email protected] scripts]
# awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'
ok
[[email protected] scripts]
# awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'
err
|
常用 awk 內建變數
注:內建變數很多,參閱相關資料
欄位分隔符 FS
FS="\t" 一個或多個 Tab 分隔
1 2 3 4 |
[[email protected] scripts]
# cat tab.txt
ww CC IDD
[[email protected] scripts]
# awk 'BEGIN{FS="\t+"}{print $1,$2,$3}' tab.txt
ww CC IDD
|
FS="[[:space:]+]" 一個或多個空白空格,預設的
1 2 3 4 5 6 |
[[email protected] scripts]
# cat space.txt
we are studing
awk
now!
[[email protected] scripts]
# awk -F [[:space:]+] '{print $1,$2,$3,$4,$5}' space.txt
we are
[[email protected] scripts]
# awk -F [[:space:]+] '{print $1,$2}' space.txt
we are
|
FS="[" ":]+" 以一個或多個空格或:分隔
1 2 3 4 |
[[email protected] scripts]
# cat hello.txt
root:x:0:0:root:
/root
:
/bin/bash
[[email protected] scripts]
# awk -F [" ":]+ '{print $1,$2,$3}' hello.txt
root x 0
|
欄位數量 NF
1 2 3 4 5 |
[[email protected] scripts]
# cat hello.txt
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
:888
[[email protected] scripts]
# awk -F ":" 'NF==8{print $0}' hello.txt
bin:x:1:1:bin:
/bin
:
/sbin/nologin
:888
|
記錄數量 NR
1 2 |
[[email protected] scripts]
# ifconfig eth0|awk -F [" ":]+ 'NR==2{print $4}' ## NR==2也就是取第2行
192.168.17.129
|
RS 記錄分隔符變數
將 FS 設定成"\n"告訴 awk 每個欄位都佔據一行。通過將 RS 設定成"",還會告訴 awk每個地址記錄都由空白行分隔。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[[email protected] scripts]
# cat recode.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco,CA 123456
Big Tony
200 Incognito Ave.
Suburbia,WA 64890
[[email protected] scripts]
# cat awk.txt
#!/bin/awk
BEGIN {
FS=
"\n"
RS=
""
}
{
print $1
","
$2
","
$3
}
[[email protected] scripts]
# awk -f awk.txt recode.txt
Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456
Big Tony,200 Incognito Ave.,Suburbia,WA 64890
|
OFS 輸出欄位分隔符
1 2 3 4 5 6 7 8 9 |
[[email protected] scripts]
# cat hello.txt
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
:888
[[email protected] scripts]
# awk 'BEGIN{FS=":"}{print $1","$2","$3}' hello.txt
root,x,0
bin,x,1
[[email protected] scripts]
# awk 'BEGIN{FS=":";OFS="#"}{print $1,$2,$3}' hello.txt
root
#x#0
bin
#x#1
|
ORS 輸出記錄分隔符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[[email protected] scripts]
# cat recode.txt
Jimmy the Weasel
100 Pleasant Drive
San Francisco,CA 123456
Big Tony
200 Incognito Ave.
Suburbia,WA 64890
[[email protected] scripts]
# cat awk.txt
#!/bin/awk
BEGIN {
FS=
"\n"
RS=
""
ORS=
"\n\n"
}
{
print $1
","
$2
","
$3
}
[[email protected] scripts]
# awk -f awk.txt recode.txt
Jimmy the Weasel,100 Pleasant Drive,San Francisco,CA 123456
Big Tony,200 Incognito Ave.,Suburbia,WA 64890
|
awk 正則
正則應用
規則表示式
awk '/REG/{action} ' file,/REG/為正則表示式,可以將$0 中,滿足條件的記錄送入到:action 進行處理
1 2 3 4 5 6 7 8 9 |
[[email protected] scripts]
# awk '/root/{print $0}' passwd ##匹配所有包含root的行
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[[email protected] scripts]
# awk -F: '$5~/root/{print $0}' passwd ## 以分號作為分隔符,匹配第5個欄位是root的行
root:x:0:0:root:
/root
:
/bin/bash
[[email protected] scripts]
# ifconfig eth0|awk 'BEGIN{FS="[[:space:]:]+"} NR==2{print $4}'
192.168.17.129
|
布林表示式 awk簡介
awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔 column 環境變量 最後一行 工作流程 初始 文本文件 for循環 其中 cti
簡介
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切 awk命令 批量關閉系統開機自啟動服務安裝好一個新的系統之後,為了簡化系統需要關閉一些開機自啟動的服務。蝸牛使用了grep和awk的基礎命令進行操作。作為服務器使用,新系統中需要啟動的服務大概就以下幾個crond network sshd rsyslog 查看運行級別3開機自啟動的服務chkconfig -- 基本 特定 收集 comm rip 解釋 文本 工作流程 復制代碼 簡介
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行各 列數 才會 遍歷數組 文本文件 信息 shell腳本 == game 入門 簡介
awk是一個強大的文本分析工具,相對於grep的查找,sed的編輯,awk在其對數據分析並生成報告時,顯得尤為強大。簡單來說awk就是把文件逐行的讀入,以空格為默認分隔符將每行切片,切開的部分 awk awk是一種處理文本文件的語言,是一個強大的文本分析工具,awk是三位創始人的首字母的縮寫。 語法: awk [選項參數] ‘script’ var=value file(s)或 awk [選項參數] -f scriptfile var=value file(s) 選 分享 相同 list 等於 connected lis gin 顯示 大於等於
awk是行處理器: 相比較屏幕處理的優點,在處理龐大文件時不會出現內存溢出或是處理緩慢的問題,通常用來格式化文本信息
awk處理過程: 依次對每一行進行處理,然後輸出
awk命令形式:
awk 是一種程式語言,用於在linux/unix下對文字和資料進行處理,它能提供一個類程式設計環境來修改和組織檔案中的資料。它比sed功能更為強大,可以看看sed的使用: Linux sed命令(一)基礎 Linux sed命令(二)進階 awk分別代表其作者姓氏的第一個字母,它
Linux常用命令解析(圖解ls)
(作者:Baron_wu) ls :顯示當前目錄下的檔案 Ls -a:顯示當前目錄下的所有檔案(包括隱藏檔案) Ls -l:以單獨一列顯示內容列表(列出許可權,所有者及其他資訊) Ls -ls:按檔案大小排序檔案內容 Ls -lar:以相反
環境:
Ubuntu14-4 核心 4.4.0-135
vim編輯器 7.4
gcc 4.8.4
1.1 知識點
Shell 的基本概念
檔案相關函式,記憶體相關函式
&nb
本文轉自:https://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html
簡介
awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把
Awk是一種便於使用且表達能力強的程式設計語言,可應用於各種計算和資料處理任務,每個Awk命令的格式都相同,由以下幾個部分組成:
pattern { action }
舉例子:
假設你有一個名為 emp.data 的檔案,其中包含員工的姓名、薪資(美元/小時)以及小時數 不管在windows平臺,還是在linux平臺,ping都是非常常用的網路命令;ping命令通過ICMP(Internet控制訊息協議)工作;ping可以用來測試本機與目標主機是否聯通、聯通速度如何、穩定性如何。
一 、ping 用法
ping命令執行在命令提示符終端,用法為:“ping 引數 目標
環境:
Ubuntu14-4 核心 4.4.0-135
vim編輯器 7.4
gcc 4.8.4
1.1 知識點
Shell 的基本概念
程序控制相關的系統呼叫的使用(如 fork,exec函式族)
整理框架:
1.命令直譯器首先是一個死迴圈。
2.
推薦awk學習系列 https://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html https://www.ibm.com/developerworks/cn/linux/shell/awk/awk-2/i
如何把一行豎排的資料轉換成橫排?
awk '{printf("%s,",$1)}' filename
awk中使用NR和FNR的一些例子
http://blog.sina.com.cn/s/blog_5a3640220100b7c8.html
http://www.linuxidc.com/Linux
簡介
awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。
awk有3個不同版本: awk、nawk和ga
awk命令作用:
文字處理
輸出格式化的文字報表
執行算數運算
執行字串操作
執行系統命令
等等
AWK的程式結構:
BEGIN 語句塊
BEGIN語句塊的語法
BEGIN {awk-commands}
BEGIN語句塊在程式開始的使用執行,它
個人覺得linux的軟體設計思想異常強大,比如把所有的裝置都當做檔案來處理,大大簡化了程式設計師的負擔,向提出這個思想的大神s致敬!!先來看看linux系統中裝置管理的基本知識: 我們的linux作業系統跟外部裝置(如磁碟、光碟等)的通訊都是通過裝置檔案
arm-linux-objdump命令用於顯示二進位制檔案的資訊,也可以用來檢視反彙編程式碼,使用格式如下:
arm-linux-objdump [-a] [-b bfdname | –target=bfdname]
awk '
相關推薦
Linux——awk命令解析
【轉】linux awk命令詳解
linux awk命令批量關閉系統開機自啟動服務
[轉載]linux awk命令詳解
linux awk命令詳解
Linux awk命令
[轉]linux awk命令詳解
Linux awk命令(一)基礎
Linux常用命令解析(圖解ls)
Linux shell命令解析器(二),命令
linux awk命令深入淺出的解釋
Linux AWK 命令介紹
linux ping 命令解析
Linux shell命令解析器(一),bash終端
linux awk 命令筆記
linux awk命令詳解(一) awk語法 awk運算 awk陣列
linux awk 命令詳解
Linux awk命令詳解
linux mknod命令解析
讀書筆記---arm-linux-objdump命令解析