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