天天看點

sed, awk 指令總結

bash程式設計之sed:

grep, sed, awk

sed: Stream EDitor,行編輯器,

sed /pattern/

p:print

sed [options] "script" FILE1 ...

例子:sed -n "/^#/p" /etc/fstab

選項:

-n: 靜默模式,即不輸出模式空間中的内容;

-e: 指定在一個sed指令中使用多個script,格式為-e 'script1' -e 'script2' ...

-i: 直接修改原檔案;不會提醒确認的。

-r: 支援使用擴充正規表達式元字元;

-f /path/to/sed_script: 從檔案中讀取處理腳本,并執行;

sed位址定界:

start_line,end_line: 例如1,7

start_line,/pattern/: 例如3,/^#/

/pattern/: 僅比對被模式到的行;

例子:

#sed '1,7p' /etc/fstab #列印/etc/fstab檔案的1到7行 p把表示列印,這樣會原有的行和比對到的行都列印出來

#sed -n '1,7p' #靜默顯示比對到的行,就是隻列印比對到的行。 -n表示靜默模式,不輸出模式空間中的内容。

#sed -n '1,7p;8,9p' #如果要指定多個比對條件的話用分号隔開。 即顯示1到7 8到9 行

#sed -n '/^#/d' #删除所有以#号開頭的行

#sed -n '/^#/!d'#删除所有不以#号開頭的行

#sed '/^#/a\the comment line' /etc/fatab #表示給是以以#号開頭的行下面加一行内容為the comment line。 其中\表示換行,

a \text:在符合條件的行後面添加指定的内容;在的添加的内容中間使用“\n”能夠完成多行附加;

#sed '/^#/!i \the comment line' #表示在非#号開頭的行的前面加上一行,!表非#号開頭的行。

i \text:在符合條件的行前面添加指定的内容;在的添加的内容中間使用“\n”能夠完成多行附加;

#sed '/^#/=' /etc/fstab #=: 顯示比對到的行的行号; 列印#号開頭的行的行号。

#sed '/^#/r /etc/issue' /etc/fstab #把/etc/fstab檔案中以#号開頭的行後面讀入/etc/issue 檔案内容。

r /path/to/somefile: 在符合條件的位置讀入指定的檔案

#sed -f sed.script /etc/fstab #表示用sed.script 腳本來處理/etc/fstab檔案,-f /path/to/sed_script: 從檔案中讀取處理腳本,并執行;

sed的常用編輯指令:

p: 列印

d: 删除

c \text: 将符合條件的行替換為指定的文本;

r /path/to/somefile: 在符合條件的位置讀入指定的檔案;

w /path/to/somefile: 将符合條件的行儲存至指定檔案中;

=: 顯示比對到的行的行号;

s@要查找的内容@替換為的内容@:

要查找的内容:可以使用模式

替換為的内容:不可以使用模式,但可以引用, &

s@@@

标志位:

i: 忽略大小寫

g:全局替換

t, T, n, N, x, h, H, g, G

基本正規表達式:

.

[]:

[0-9], [[:digit:]]

[a-z], [[:lower:]]

[A-Z], [[:upper:]]

[a-zA-Z], [[:alpha:]]

[a-zA-Z0-9], [[:alnum:]]

[[:space:]], [[:punct:]]

[^]

\{m,n\}

\{m\}

\{m,\}

\{0,n\}

*

\?

^

$

\<, \b

\>, \b

\(\), \1, \2, ...

擴充正規表達式:

{m,n}

?

+

|

(), \1, \2

He like his liker.

He like his lover.

She love her liker.

She love her lover.

1、删除上述内容中l..e前後一緻的行;

2、将上述内容中l..e前後一緻的後而的l改為大寫L;

sed練習:

1、删除/etc/grub.conf檔案中行首的空白符;

2、替換/etc/inittab檔案中"id:3:initdefault:"一行中的數字為5;

3、删除/etc/inittab檔案中的空白行;

4、删除/etc/inittab檔案中開頭的#号;

5、删除某檔案中開頭的#号及後面的空白字元,但要求#号後面必須有空白字元;

6、删除某檔案中以空白字元後面跟#類的行中的開頭的空白字元及#

7、取出一個檔案路徑的目錄名稱;例如,/etc/sysconfig/的目錄名稱為/etc;

awk的基本用法:nawk ,awk本身是uninx 中的指令。

報告生成工具

GNU: gawk #linux中的awk通常都是連結至gawk,

grep,sed,awk 使用建議。

grep: 文本過濾工具,如果僅僅是将文本過濾下顯示出來的話,建議使用grep。

sed:文本編輯工具,如果不涉及到編輯就不要用sed。

awk:報告生成工具,如果不涉及到文本輸出内容的處理就不要使用awk。

awk 指令格式:

awk [options] '/pattern/{action}' FILE #如果是想處理每行的話就可以不需要pattern。

模式:pattern 模式比對有如下幾種方式: 模式 最難的也是在比對模式上面。

pat1,pat2

/pattern/

expression(表達式)

>, <, >=, <=, ==, !=, ~(模式比對)

#awk '$3=="ext4"{print $1}' /etc/fastab #比對第三字段為ext4的行并且顯示第一字段

BEGIN #在操作之前進行的行為。

END #在操作之後進行的行為。

#awk -F: 'BEGIN{print "username uid"}$3>500{print $1,$3}' /etc/passwd

#在/etc/passwd檔案中比對出$3>500 的行并顯示第一和第三字段,并且顯示此操作之前先執行指令print ”username uid“

action:

print 簡單顯示

printf 固定格式顯示 如果左對齊右對齊。

-F: 指定分隔符 ,預設空白是分隔符。

#awk -F: '/bash$/{print $1}' /etc/passwd #在/etc/passwd 檔案中首先比對以bash結尾的行,然後以冒号為分隔符切片,列印第一個字段。

/bash$表示比對以bash結尾的行。同樣稱為模式。

例子:

内置變量,

NF: Number of Field 字段數

NF=7

$NF=$7

例子:

下面是awk.txt中的内容,現在要取出每行的最後一個字段的内容。

how are you?

how do you do?

how old are you?

this is the fouth line.

#awk '{print $NF}' awk.txt #$NF 為每行的字段數, 如第一行是$NF 為3 就列印出第三字段。第二行$NF為4就顯示第四字段。

you?

do?

line.

練習:

1、顯示GID小于500的組;

#awk -F: '$3>500 {print $1}' /etc/group

2、顯示預設shell為nologin的使用者;

#awk -F: '$7=="/sbin/nologin"{print $1}' /etc/passwd

3、顯示eth0網卡配置檔案的配置資訊,注意,隻顯示等号後面的值;

#awk -F= '{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0

4、顯示/etc/sysctl.conf檔案中以net開頭的行,以等号為分隔符的第二個字段;

#awk -F= '/^net/{print $2}' /etc/sysctl.conf

5、顯示eth0的ip位址;通過過濾ifconfig的結果來實作;

#ifconfig eth0|grep "inet addr"|awk -F: '{print $2}'|cut -d' ' -f1