天天看點

文本處理工具sed及awk的用法

sed: stream editor, 流編輯器;

sed對文本的處理很強大,并且sed非常小,參數少,容易掌握,他的操作方式根awk有點像。sed按順序逐行讀取檔案。然後,它執行為該行指定的所有操作,并在完成請求的修改之後的内容顯示出來,也可以存放到檔案中。完成了一行上的所有操作之後,它讀取檔案的下一行,然後重複該過程直到它完成該檔案。在這裡要注意一點,源檔案(預設地)保持不被修改。sed預設讀取整個檔案并對其中的每一行進行修改。說白了就是一行一行的操作。我用sed主要就是用裡面的替換功能,真的很強大。

sed –h

-n, --quiet, --silent    取消自動列印模式空間

-e 腳本, --expression=腳本   添加“腳本”到程式的運作清單

-f 腳本檔案, --file=腳本檔案  添加“腳本檔案”到程式的運作清單

 --follow-symlinks    直接修改檔案時跟随軟連結

 -i[擴充名], --in-place[=擴充名]   直接修改檔案(如果指定擴充名就備份檔案)

 -l N, --line-length=N   指定“l”指令的換行期望長度

 --posix  關閉所有 GNU 擴充

 -r, --regexp-extended  在腳本中使用擴充正規表達式

 -s, --separate  将輸入檔案視為各個獨立的檔案而不是一個長的連續輸入

 -u, --unbuffered  從輸入檔案讀取最少的資料,更頻繁的重新整理輸出

基本正規表達式元字元:

           字元比對:., [], [^]

           次數比對:*, \?, \+,\{m,n\}, \{n\}

           位置錨定:^, $, \<, \>

           分組及引用:\(\), \1, \2, ...

           多選一:a|b|c

删除/tmp/grub2.cfg檔案中所有行的行首的空白字元;

sed 's/^[[:space:]]\+//' /tmp/grub2.cfg      

删除/tmp/grub2.cfg檔案中所有以#開頭,後跟至少一個空白字元的行的行首的#和空白字元;

sed 's/^#[[:space:]]\+//' /tmp/grub2.cfg      

awk(gawk):文本格式化工具,報告生成器

awk是linux下的一個指令,他對其他指令的輸出,對檔案的處理都十分強大,其實他更像一門程式設計語言,他可以自定義變量,有條件語句,有循環,有數組,有正則,有函數等。他讀取輸出,或者檔案的方式是一行,一行的讀,根據你給出的條件進行查找,并在找出來的行中進行操作,感覺他的設計思想,真的很簡單,但是結合實際情況,具體操作起來就沒有那麼簡單了。他有三種形勢,awk,gawk,nawk,平時所說的awk其實就是gawk。

1,變量

變 量 描述
$n 目前記錄的第n個字段,字段間由 FS分隔。
$0 完整的輸入記錄。
ARGC 命 令行參數的數目。
ARGIND 指令行中目前檔案的位置(從0開始算)。
ARGV 包 含指令行參數的數組。
CONVFMT 數字轉換格式(預設值為%.6g)
ENVIRON 環 境變量關聯數組。
ERRNO 最後一個系統錯誤的描述。
FIELDWIDTHS 字 段寬度清單(用空格鍵分隔)。
FILENAME 目前檔案名。
FNR 同 NR,但相對于目前檔案。
FS 字段分隔符(預設是任何空格)。
IGNORECASE 如 果為真,則進行忽略大小寫的比對。
NF 目前記錄中的字段數。
NR 當 前記錄數。
OFMT 數字的輸出格式(預設值是%.6g)。
OFS 輸 出字段分隔符(預設值是一個空格)。
ORS 輸出記錄分隔符(預設值是一個換行符)。
RLENGTH 由 match函數所比對的字元串的長度。
RS 記錄分隔符(預設是一個換行符)。
RSTART 由 match函數所比對的字元串的第一個位置。
SUBSEP 數組下标分隔符(預設值是\034)。

2,運算符

運算符
= += -= *= /= %= ^= **= 指派
?: C條件表達式
|| 邏 輯或
&& 邏輯與
~ ~! 匹 配正規表達式和不比對正規表達式
< <= > >= != == 關 系運算符
空格 連接配接
+ - 加,減
* / & 乘,除與求餘
+ - ! 一進制加,減和邏輯非
^ *** 求幂
++ -- 增加或減少,作為字首或字尾
$ 字 段引用
in 數組成員

3,awk的正則

比對符
\Y 比對一個單詞開頭或者末尾的空字元串
\B 比對單詞内的空字元串
\< 比對一個單詞的開頭的空字元串,錨定開始
\> 比對一個單詞的末尾的空字元串,錨定末尾
\W 比對一個非字母數字組成的單詞
\w 比對一個字母數字組成的單詞
\' 比對字元串末尾的一個空字元串
\‘ 比對字元串開頭的一個空字元串

4,字元串函數

函數名
sub 比對記錄中最大、最靠左邊的子字元串的正規表達式,并用替換字元串替換這些字元串。如果沒有指定目标字元串就預設使用整個記錄。替換隻發生在第一次比對的  時候
gsub 整個文檔中進行比對
index 傳回子字元串第一次被比對的位置,偏移量從位置1開始
substr 傳回從位置1開始的子字元串,如果指定長度超過實際長度,就傳回整個字元串
split 可按給定的分隔符把字元串分割為一個數組。如果分隔符沒提供,則按目前FS值進行分割
length 傳回記錄的字元數
match 傳回在字元串中正規表達式位置的索引,如果找不到指定的正規表達式則傳回0。match函數會設定内建變量RSTART為字元串中子字元串的開始位 置,RLENGTH為到子字元串末尾的字元個數。substr可利于這些變量來截取字元串
toupper和tolower 可用于字元串大小間的轉換,該功能隻在gawk中有效

5,數學函數

傳回值
atan2(x,y) y,x 範圍内的餘切
cos(x) 餘弦函數
exp(x) 求 幂
int(x) 取整
log(x) 自然對 數
rand() 随機數
sin(x) 正弦
sqrt(x) 平 方根
srand(x) x是rand()函數的種子
取 整,過程沒有舍入
産生一個大于等于0而小于1的随機數