1. 程式人生 > >Linux文本處理工具

Linux文本處理工具

linux、grep、sed、awk

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:不顯示不存在或無匹配文本的錯誤信息。

-v:顯示不包含匹配文本的所有行。

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文本處理工具