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