Linux文本處理工具
1、grep
grep(global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
語法:
grep [options] ‘pattern‘ input_file ...
[options]主要參數:
-c:只輸出匹配行的計數。
-I:不區分大 小寫(只適用於單字符)。
-h:查詢多文件時不顯示文件名。
-l:查詢多文件時只輸出包含匹配字符的文件名。
-n:顯示匹配行及 行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
pattern正則表達式主要參數:
\: 忽略正則表達式中特殊字符的原有含義。
^:匹配正則表達式的開始行。
$: 匹配正則表達式的結束行。
\<:從匹配正則表達 式的行開始。
\>:到匹配正則表達式的行結束。
[ ]:單個字符,如[A]即A符合要求 。
[ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的單個字符。
* :有字符,長度可以為0。
2、sed
sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成後,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
sed :Stream EDitor
行編輯器(全屏編輯器:vim)
sed:模式空間
默認不編輯源文件,僅對模式空間中的數據做處理;而後,處理結束後,將模式空間打印至屏幕;
sed用法:
sed [options] ‘AddressCommand‘ file ...
options常用參數:
-n:靜默模式,不在默認顯示模式空間中的內容
-i:直接修改原文件
-e SCRIPT -e SCRIPT:可以同時執行多個腳本
-f /PATH/TO/SED_SCRIPT
用法:sed -f /path/to/script file
Address:
1、StartLine,Endline
比如1,100
$:最後一行
2、/RegExp/
/^root/
3、/pattern1/,/patteern2/
第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所有行
4、LineNumber
指定的行
5、StartLine,+N
從startLine開始,向後的N行;
Command:
d:刪除符合條件的行;
p:顯示符合條件的行;
a \string:在指定的行後面追加新行,內容為string
\n:可以用於換行
i \string:在指定的行前面添加新行,內容為string
r filename:將指定的文件的內容添加至符合條件的行處
w filename:將地址指定的範圍內的行另存至指定的文件中;
s/pattern(可以使用正則表達式的字符,而string不可以)/string/修飾符:查找並替換,默認替換每行中第一次被模式匹配到的字符串
加修飾符:
g:全局替換
i:忽略字符大小寫
s///,s###,s@@@,s::: sed可采用任意字符作為定界符
\(..\),\1,\2 \(..\)用於匹配字符串,匹配到的第一個字符串則為\1,以此類推為\2
sed練習:
1、刪除/etc/grub.conf文件中行首的空白符;
sed -r ‘s#^[[:space:]]+##g‘ /etc/grub.conf
2、替換/etc/inittab文件中“id:3:initdefault:”一行中的數字為5;
sed ‘s@\(id:\)[0-9]\(:initdefault:\)@\1\5\[email protected] /etc/inittab
3、刪除/etc/inittab文件中的空白行;
sed ‘/^$/d‘ /etc/inittab
4、刪除/etc/inittab文件中開頭的#號;
sed ‘s/^#//g‘ /etc/inittab
5、刪除某文件中開頭的#號及後面的空白,但要求#號後面必須有空白字符;
sed ‘s/^#[[:space:]]+//g‘ sed.txt
6、刪除某文件以空白符後面跟#類的行中的靠頭的空白字符及#;
sed ‘s/^[[:space:]]+#//g‘ sed.txt
7、去除一個文件路徑的目錄名稱。
echo "/etc/rc.d/" | sed -r ‘s@^(/.*/)[^/]+/?@\[email protected]
3、awk
awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據可以來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更多是作為腳本來使用。awk有很多內建的功能,比如數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優勢。
語法:awk ‘PATTERN[ACTION]‘ file
print $1
-F
# awk [options] ‘script‘ file1 file2, ...
# awk [options] ‘PATTERN‘ { action }‘ file1 file2, ...
awk的輸出:
一、print
print的使用格式:
print item1,item2,...
要點:
1、各項目之間使用逗號隔開,而輸出時則以空白字符分割;
2、輸出的item可以為字符串或數值、當前記錄的字段(如$1)、變量或awk的表達式;數值會先轉換為字符串,而後再輸出;
3、print命令後面的item可以省略,此時其功能相當於print $0,因此,如果想輸出空白行,則需要使用pring "";
例子:
# awk ‘BEGIN { print "line one\nline two\nline three" }‘
awk -F: ‘{ print $1,$3 }‘ /etc/passwd
二、awk變量
2.1 awk內置變量之記錄變量
FS:field separator,讀取文本時,所使用字段分隔符;
RS:Record separator,輸入文本信息所用的換行符;
OFS:Output Filed Separator
ORS:Output Row Separator
2.2 awk內置變量之數據變量
NR: The number of input records,awk命令所處理的記錄數;如果有多個文件,這個數目會把處理的多個文件中行統一計數;
NF:Number of Field,當前記錄的field個數;
FNR: 與NR不同的是,FNR用於記錄正處理的行是當前這一文件中被總共處理的行數;
ARGV: 數組,保存命令行本身這個字符串,如awk ‘{print $0}‘ a.txt b.txt這個命令中,ARGV[0]保存awk,ARGV[1]保存a.txt;
ARGC: awk命令的參數的個數;
FILENAME: awk命令所處理的文件的名稱;
ENVIRON:當前shell環境變量及其值的關聯數組;
如:awk ‘BEGIN{print ENVIRON["PATH"]}‘
三、printf
printf命令的使用格式:
printf format, item1, item2, ...
要點:
1、其與print命令的最大不同是,printf需要指定format;
2、format用於指定後面的每個item的輸出格式;
3、printf語句不會自動打印換行符;\n
format格式的指示符都以%開頭,後跟一個字符;如下:
%c: 顯示字符的ASCII碼;
%d, %i:十進制整數;
%e, %E:科學計數法顯示數值;
%f: 顯示浮點數;
%g, %G: 以科學計數法的格式或浮點數的格式顯示數值;
%s: 顯示字符串;
%u: 無符號整數;
%%: 顯示%自身;
修飾符:
N: 顯示寬度;
-: 左對齊;
+:顯示數值符號;
例子:
# awk -F: ‘{printf "%-15s %i\n",$1,$3}‘ /etc/passwd
四、輸出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin:標準輸入
/dev/sdtout: 標準輸出
/dev/stderr: 錯誤輸出
/dev/fd/N: 某特定文件描述符,如/dev/stdin就相當於/dev/fd/0;
例子:
# awk -F: ‘{printf "%-15s %i\n",$1,$3 > "/dev/stderr" }‘ /etc/passwd
五 awk的模式:
awk ‘program‘ input-file1 input-file2 ...
其中的program為:
pattern { action }
pattern { action }
...
5.1 常見的模式類型:
1、Regexp: 正則表達式,格式為/regular expression/
2、expresssion: 表達式,其值非0或為非空字符時滿足條件,如:$1 ~ /foo/ 或 $1 == "magedu",用運算符~(匹配)和!~(不匹配)。
3、Ranges: 指定的匹配範圍,格式為pat1,pat2
4、BEGIN/END:特殊模式,僅在awk命令執行前運行一次或結束前運行一次
5、Empty(空模式):匹配任意輸入行;
模式匹配表達式:
模式,模式:指定一個行的範圍。該語法不能包括BEGIN和END模式。
BEGIN:讓用戶指定在第一條輸入記錄被處理之前所發生的動作,通常可在這裏設置全局變量。
END:讓用戶在最後一條輸入記錄被讀取之後發生的動作。
本文出自 “小白學IT” 博客,請務必保留此出處http://xiaojiejt.blog.51cto.com/12536455/1937412
Linux文本處理工具