shell awk命令筆記

2021-08-22 00:26:14 字數 3589 閱讀 1520

#正規表示式的一些最基本的東西:

^ 表示一行的開頭。如:/^#/ 以#開頭的匹配。

$ 表示一行的結尾。如:/}$/ 以}結尾的匹配。

\< 表示詞首。 如:\表示詞尾。 如: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...