天天看点

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