正則表達式二linux
一 printf命令正則表達式
·介紹shell
printf是一個把從標準輸入的字符按照你所要求的格式輸出到標準輸出即屏幕的命令. 在不少時候,咱們可能須要將本身的數據給他格式化輸出的。例如考試分數的輸出:假設有一個文件test.txt記錄着考試分數,內容以下圖所示:ide
上表的數據主要分紅五個字段,各個字段之間可以使用 tab 或空格鍵進行分隔工具
·printf命令格式:spa
printf
關於格式方面的幾個特殊樣式3d
·應用regexp
例如1:下列命令是以整數形式輸出23並換行;以字符串形式輸出hello並換行.blog
例如2:下列命令是以4位整數形式輸出23並換行;以7位字符串形式輸出hello並換行.
例如3:
如上所示,printf命令的輸出結果並無對齊,%s表明一個不固定長度的字符串,而字符串與字符串中間就以 \t 這個 [tab] 分隔符來處理。既然每一個字段的長度不固定會形成上述的困擾,那我將每一個字段固定就好啦。
將test.txt文件中的內容,分別以字符串、整數、小數點來顯示:
上面的格式共分爲五個字段, s 表明的是一個長度爲 10 個字符的字符串字段,%5i 表明的是長度爲 5 個字符的數字字段,至於那個 %8.2f 則表明長度爲 8 個字符的具備小數點的字段,其中小數點有兩個字符寬度;所有的寬度僅有 8 個字符,整數部分佔有 5 個字符,小數點自己 (.) 佔一位,小數點後的位數則有兩位。
printf 除了能夠格式化處理以外,他還能夠依據ASCII 的數字與字符對應來顯示數據,舉例來講 16 進位的 55 能夠獲得什麼 ASCII 的顯示字符?
二 awk命令
·介紹
awk也是一個數據處理工具!相較於 sed 經常做用於一整個行的處理, awk 則比較傾向於一行當中分紅數個字段來處理
.awk語言的最基本功能是在文件或字符串中基於指定規則來分解抽取信息,也能夠基於指定的規則來輸出數據
·命令格式
有三種方式調用awk
1.命令行方式
awk [-F field-separator] 'commands' input-files
其中,[-F域分隔符]是可選的,由於awk使用空格或tab鍵做爲缺省的域分隔符,所以若是要瀏覽域間有空格的文本,沒必要指定這個選項,若是要瀏覽諸如passwd文件,此文件各域以冒號做爲分隔符,則必須指明-F選項,如:awk -F: 'commands' input-file。
注:在linux系統中用環境變量IFS存儲分隔符,但根據實際應用也能夠改變IFS的值.
例如:
腳本執行結果以下:
commands 是真正awk命令, input-files 是待處理的文件。
iput_files能夠是多於一個文件的文件列表,awk將按順序處理列表中的每一個文件。
在awk中,文件的每一行中,由域分隔符分開的每一項稱爲一個域。一般,在不指名-F域分隔符的狀況下,默認的域分隔符是空格或tab鍵。
2.shell腳本方式
將全部的awk命令插入一個文件,並使awk程序可執行,而後awk命令解釋器做爲腳本的首行,以便經過鍵入腳本名稱來調用。
至關於shell腳本首行的:#!/bin/sh能夠換成:#!/bin/awk
3.將全部的awk命令插入一個單獨文件,而後調用:
Awk
其中,-f選項加載awk-script-file中的awk腳本,input-files跟上面的是同樣的。
awk的模式和動做
任何awk語句都由模式和動做組成(awk_pattern { actions })。
在一個awk腳本中可能有許多語句。
模式部分決定動做語句什麼時候觸發及觸發事件。處理即對數據進行的操做。若是省略模式部分,動做將時刻保持執行狀態。即省略時不對輸入記錄進行匹配比較就執行相應的actions。
模式能夠是任何條件語句或正則表達式等。awk_pattern能夠是如下幾種類型:
1) 正則表達式用做awk_pattern: /regexp/
例如:awk '/ ^[a-z]/' input_file
2) 布爾表達式用做awk_pattern,表達式成立時,觸發相應的actions執行。
① 表達式中可使用變量(如字段變量$1,$2等)和/regexp/
② 布爾表達式中的操做符:
關係操做符: < > <= >= == !=
匹配操做符: value ~ /regexp/ 若是value匹配/regexp/,則返回真
value !~ /regexp/ 若是value不匹配/regexp/,則返回真
例如: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file
③ &&(與) 和 ||(或) 能夠鏈接兩個/regexp/或者布爾表達式,構成混合表達式。!(非) 能夠用於布爾表達式或者/regexp/以前。
例如: awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print "ok"}' input_file
模式包括兩個特殊字段 BEGIN和END。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依據輸入文本開始執行。END語句用來在awk完成文本瀏覽動做後打印輸出文本總數和結尾狀態標誌。
實際動做在大括號{ }內指明。動做大多數用來打印,可是還有些更長的代碼諸如i f和循環語句及循環退出結構。若是不指明採起動做,awk將打印出全部瀏覽出來的記錄。
awk執行時,其瀏覽域標記爲$1,$2...$n。這種方法稱爲域標識。使用這些域標識將更容易對域進行進一步處理。
使用$1 , $3表示參照第1和第3域,注意這裏用逗號作域分隔。若是但願打印一個有5個域
的記錄的全部域,沒必要指明$1 , $2 , $3 , $4 , $5,可以使用$0,意即全部域。
爲打印一個域或全部域,使用print命令。這是一個awk動做
awk的運行過程:
·應用
例1:顯示/etc/passwd文件中的用戶名和登陸shell
若是隻是顯示/etc/passwd的帳戶和帳戶對應的shell,而帳戶與shell之間以tab鍵分割
若是隻是顯示/etc/passwd文件中的用戶名和登陸shell, 而帳戶與shell之間以逗號分割
注:awk的老是輸出到標準輸出,若是想讓awk輸出到文件,可使用重定向。
例2:顯示/etc/passwd文件中的UID大於500的全部用戶的用戶名和登陸shell
例3:若是隻是顯示/etc/passwd文件中的UID大於500的用戶名和登陸shell,而帳戶與shell之間以逗號分割,並且在全部行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。
注:
1.awk 後面接兩個單引號並加上大括號 {} 來設定想要對數據進行的處理動做
2.awk工做流程是這樣的:先執行BEGING,而後讀取文件,讀入有\n換行符分割的一條記錄,而後將記錄按指定的域分隔符劃分域,填充域,$0則表示全部域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動做。接着開始讀入第二條記錄······直到全部的記錄都讀完,最後執行END操做。
思考題:如何打印全部記錄(以/etc/passwd中的內容爲例)
例4:搜索/etc/passwd有root關鍵字的全部行
這種是pattern(模式)的使用示例,匹配了pattern(這裏是root)的行纔會執行action(沒有指定action,默認輸出每行的內容)。
搜索支持正則表達式,例如找root開頭的:
搜索/etc/passwd有root關鍵字的全部行,並顯示對應的shell
這裏指定了action是{print $7}
例5:顯示最近登陸系統的5個用戶信息,只顯示用戶名和IP地址
使用last命令能夠查看最近登陸的用戶信息。以下圖所示:
使用awk命令抽取用戶名和IP區域的數據
或
awk內置變量
awk有許多內置變量用來設置環境信息,下面給出了最經常使用的一些變量。
FILENAME awk瀏覽的文件名
FS 設置輸入域分隔符,等價於命令行-F選項
NF 瀏覽記錄的域個數(每一行($0)擁有的字段總數)
NR 已讀的記錄數(awk所處理的是第幾行數據)
例6:統計/etc/passwd:文件名,每行的行號,每行的列數,對應的完整行內容:
顯示全部帳戶的記錄,並帶有其記錄號,並在END部分打印輸入文件名
除了awk的內置變量,awk還能夠自定義變量
例7:統計/etc/passwd的帳戶人數
count是自定義變量。以前的action{}裏都是隻有一個print,其實print只是一個語句,而action{}能夠有多個語句,以;號隔開。
這裏沒有初始化count,雖然默認是0,可是穩當的作法仍是初始化爲0:
例8:統計某個文件夾下的文件佔用的字節數
若是以M爲單位顯示:
注意:以上統計沒有包括子目錄中的文件。
若是想快速查看全部文件的長度及其總和,但要排除子目錄,如何實現: