shell學習十七天 awk命令

2021-07-03 09:32:11 字數 4018 閱讀 4170

使用awk

重新編排字段

awk非常擅長處理結構化資料和生成表單.和

sed和

grep

很相似.

由於awk

具備各種及哦啊本語言的特點

,所以可以把它看做是一種指令碼語言.

先來看個案例,

只檢視/etc/passwd/

目錄下的使用者名稱和組名

awk -f: 『』 /etc/passwd

意思是:使用:

來分割這一行

,把這一行的第一和第五個字段列印出來.

呼叫awk:

第一種方式:

awk [-f 分隔符

] 『commands』 input-file(s)

這裡的commands

是真正的

awk命令

,[-f 

分隔符]

適可選的

,awk

預設使用空格分隔,因此如果要瀏覽域間有空格的文字,不必指定這個選項,但如果瀏覽如

passwd

檔案,此檔案各域使用冒號作為分隔符,則必須使用

-f選項

:   awk -f : 'commands' input-file

第二種方式:

將所有awk

命令插入乙個檔案,並使

awk程式可執行,然後用

awk命令直譯器作為指令碼的首行,以便通過鍵入指令碼名稱來呼叫它

第三種方式

將所有awk

命令插入乙個單獨檔案,然後呼叫,如

: awk -f awk-script-file input-file

-f選項指明在檔案

awk-script-file

的awk

指令碼,input-file

是使用awk

進行瀏覽的檔名

任何awk

語句都是由模式和動作組成,在乙個

awk指令碼中可能有許多語句。模式部分決定動作語句何時觸發及觸發事件。動作即對資料進行的操作,如果省去模式部分,動作將時刻保持執行狀態

模式可以是任何條件語句或復合語句或正規表示式,模式包含兩個特殊字段

begin

和end

,使用begin

語句設定計數和列印頭,

begin

語句使用在任何文字瀏覽動作之前,之後文字瀏覽動作依據輸入檔案開始執行

;end

語句用來在

awk完成文字瀏覽動作後列印輸出文字總數和結尾狀態標誌,有動作必須使用

{}括起來

實際動作在大括號

{}內指明,常用來做列印動作,但是還有更長的**如

if和迴圈

looping

語句及迴圈退出等,如果不指明採取什麼動作,

awk預設列印出所有瀏覽出的記錄

awk執行時,其瀏覽標記為$1,

$2...$n

,這種方法稱為域標記。使用$1,

$3表示參照第1和第

3域,注意這裡使用逗號分隔域,使用

$0表示使用所有域。例

awk -f :『』 /etc/passwd    //表示列印所有域並把結果重定向到

/etc/passwd中(

所謂的域就是某一行中的字段)

awk -f : 『』 /etc/passwd   ///在螢幕上顯示出來

awk 『』 /etc/passwd    //只列印第一和第四域

(第一和第四字段)

awk -f: 『brgin』 /etc/passwd   //表示列印頭資訊

,在輸入的內容的第一行前加上」hahaha」,同時內容之間用

tab鍵分開.

awk -f: 'beginend' /etc/passwd   //這個代表的意思是說列印開頭結尾

awk的條件匹配符

<、

<=、==

、!=、>=、~

匹配正規表示式、

!~不匹配正規表示式

匹配:awk -f: '' /etc/passwd   //

在/etc/passwd

這個檔案中

,如果某條記錄的第乙個字段含有

root

就列印整條記錄到螢幕上,注意

,只要包含就行.

精確匹配 :  awk -f: '$1=="root"' /etc/passwd //

某行中的第乙個字段必須等於

root

才列印.

不匹配 :   awk -f: '$0!~"root"' /etc/passwd  

列印整條不包含

root

的記錄,

使用雙引號或者反斜槓都是一樣的.

其他的操作符具體不在介紹.

awk的設計目的就是操作記錄與字段

:awk

讀取輸入記錄

(通常是一些行

),然後自動將各個記錄且分為字段

.awk

將每條記錄內的字段樹木

,儲存到內建變數

nf.

通過上面的例子,

差不多已經總體上有了一定得了解:

awk 『』  列印最後一行

比較特殊的字段是編號0,

表示整條記錄.

awk內建變數

argc               命令列引數個數

argv               命令列引數排列

environ            支援佇列中系統環境變數的使用

filename           awk瀏覽的檔名

fnr                瀏覽檔案的記錄數

fs                 設定輸入域分隔符,等價於命令列 

-f選項

nf                 瀏覽記錄的域的個數

nr                 已讀的記錄數

ofs                輸出域分隔符

ors                輸出記錄分隔符

rs                 控制記錄分隔符

案例:

統計/etc/passwd:

檔名,每行的行號,每行的列數,對應的完整行內容:

awk  -f ':'  '' /etc/passwd

除了awk

的內建變數

,awk

還可以自定義變數.

例如:統計

/etc/passwd

的行數:

awk 'end' /etc/passwd

count是自定義變數

,這裡沒有初始化

count,

雖然預設是

0,但是妥當的做法還是初始化為0.

awk 'beginend' /etc/passwd

例如:統計某個資料夾下的檔案占用的位元組數

ls -l |awk 'begin   end'

如果按照m

為單位顯示

ls -l |awk 'begin   end' 

小結:

如果需要從輸入的資料資料夾中取出特定的文字行,

主要的工具為

grep程式.

sed是處理簡單字串替換的主要工具

.大部分

shell

指令碼在使用

sed時幾乎都是用來做替換的操作.

「從最左邊開始,

擴充套件至最長」這個法則描述了匹配的文字在何處匹配以及匹配擴充套件到多長.

在使用sed,awk

或其他互動式文字編輯程式時

,這個法則相當重要.

cut命令用以剪下選定的字元範圍或字段

,join

則是用來結合記錄中具有共同鍵值的字段的檔案.

awk多半用於簡單的」單命令列程式」,當你想要只顯示選定的字段

,或是重新安排行內的字段順序時,就是

awk排上用場的時候了.由於

awk還是程式語言

,即使在尖端的程式裡

,他也能發揮強大的作用

.

shell學習三十七天 引用

引用 案例,如果我想輸出乙個星號 使用echo 如何做?echo 這是肯定不行的,需要將 轉移,即 echo 這樣就引出了引用的概念.所為引用 是用來防止 shell 將某些你想要的東西解釋成不同的意義 如果你希望某些可能被 shell 視為個別引數的東西保持為單個引數 這時你就必須將其引用.引用的...

Python學習 第十七天

在下這廂有禮了 練習 python修改檔案時,使用w模式會將原本的檔案清空 覆蓋。可以先用讀 r 的方式開啟,寫到記憶體中,然後再用寫 w 的方式開啟。yesterday when i was young 昨日當我年少輕狂 the taste of life was sweet 生命的滋味是甜的 a...

linux學習第十七天

18.1 資料庫管理系統 資料庫是指按照某些特定結構來儲存資料資料的資料倉儲。在當今這個大資料技術迅速崛起的年代,網際網路上每天都會生成海量的資料資訊,資料庫技術也從最初只能儲存簡單的 資料的單一集中儲存模式,發展到了現如今儲存海量資料的大型分布式模式。在資訊化社會中,能夠充分有效地管理和利用各種資...