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: 删除
a \text:在符合条件的行后面添加指定的内容;在的添加的内容中间使用“\n”能够完成多行附加;
i \text:在符合条件的行前面添加指定的内容;在的添加的内容中间使用“\n”能够完成多行附加;
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, ...
扩展正则表达式:
.
[]:
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[a-zA-Z], [[:alpha:]]
[a-zA-Z0-9], [[:alnum:]]
[[:space:]], [[:punct:]]
[^]
{m,n}
*
?
+
|
(), \1, \2
^
$
\<, \b
\>, \b
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?
you?
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