Sed和AWK是都是面向行的,或者说它们处理文本的方式都是一行接着一行的处理,从标准输入或者文件中读取内容,一行一行的执行脚本命令,然后打印输出到标准输出,直到文件结尾(EOF).。
Sed: 用于修改文件内容
Sed是一个流编辑器(Stream editor),它的功能在于对于一个输入流进行编辑和处理。相当于是对一个输入流进行脚本性的ed(编辑)。
用s命令替换
$cat test.txt
This is my cat my
mycat's name is betty my
This is my dog
my dog's name is frank
把其中的my字符串替换成 tammy’s,/g 表示一行上的替换所有的匹配):
$sed "s/my/tammy's/" test.txt
单引号无法通过\’这样来转义,双引号可以用\”来转义。
可直接重定向到文件或使用- i 参数直接对文件进行修改。
在每一行最前面加点东西:
$sed 's/^/XXX/g' pets.txt
在每一行最后面加点东西:s
$sed 's/$/XXX/g' pets.txt
下面的命令只替换第3到第6行的文本。
$sed "3,6s/my/your/g" pets.txt
只替换每一行的第一个s:
$sed 's/s/S/1' my.txt
只替换每一行的第二个s:
$sed 's/s/S/2' my.txt
只替换第一行的第3个以后的s:
$sed 's/s/S/3g' my.txt
顺手介绍一下正则表达式的一些最基本的东西:
^表示一行的开头。如:/^#/ 以#开头的匹配。
$表示一行的结尾。如:/}$/ 以}结尾的匹配。
\<表示词首。 如:\
\>表示词尾。 如:abc\>表示以 abc 結尾的詞。
.表示任何单个字符。
*表示某个字符出现了0次或多次。
[ ]字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符
多个匹配
$sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt
等价于 sed-e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt
我们可以使用&来当做被匹配的变量,然后可以在基本左右加点东西。
$sed's/my/[&]/g'my.txt
This is [my]cat, [my]cat's name is betty
a命令和i命令
a命令就是append, i命令就是insert,它们是用来添加行的。如:
#其中的1i表明,其要在第1行前插入一行(insert)
$sed"1 i This is my monkey, my monkey's name is wukong"my.txt
# 其中的1a表明,其要在最后一行后追加一行(append)
$sed"$ a This is my monkey, my monkey's name is wukong"my.txt
c命令
c 命令是替换匹配行
$sed"2 c This is my monkey, my monkey's name is wukong"my.txt
d命令
删除匹配行
$sed'2d'my.txt
去除空白行
sed'/^$/d'file
awk
awk工作流程:读入有‘\n’ 换行符分割的一条记录,然后将记录按指定的与分隔符划分域,填充域,$0则表示所有域,$1则表示第一个域,$n则表示第n个域。默认域分隔符是空白键或tab键
last -n 5 仅取出前五行
仅输出第一列
last -n 5 | awk '{print $1}'
#cat /etc/passwd |awk -F ':' '{print $3}'
-F指定域分隔符,为‘:’
同时显示两列
#cat /etc/passwd | awk -F ':' '{print $1"\t"$7}'
\t 表示tab键
cat /etc/passwd | awk-F':''BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
grep 打印匹配文本行
grep ‘字符串’ 文件名:显示文件中带有字符串的行
grep ‘字符串’ d*:显示以字母d为开头的文件中带有字符串的行
cat a.txt | grep AAA | grep -v BBB | wc - l
查找a.txt中包含AAA,但不包含BBB的文件的总数