shell的三剑客:
sed:修改文本
grep:过滤文本
awk:处理文本
sed:
和正则表达式一起使用,用于匹配删除,追加等操作,比如:
//如果仅仅想替换行中的部分数据,就要使用“s”动作了。g 使得 sed 对文件中所有符合的字符串都被替换,
//修改后内容会到标准输出,不会修改原文件 ,修改反映到原文件,需要加-i
[root@localhost ~]$ sed 's/旧字串/新字串/g' 文件名
[root@localhost ~]$ sed '行范围s/旧字串/新字串/g' 文件名
//c为替换字符串。
[root@localhost ~]$ sed -i '2c No such person' student.txt //第二行开始全部替换为No such person
//并且-i :标识直接修改到源文件,没有-i,则知识将修改反馈到屏幕上。
[root@localhost ~]$ sed '2a hello' student.txt //a:标识追加数据 #在第二行后加入 hello
[root@localhost ~]$ sed '2i hello' student.txt //i: 标识插入数据 在第二行插入hello
[root@localhost ~]$ sed '2,4d' student.txt // d :标识删除数据,#删除第二行到第四行数据
[root@localhost ~]$ sed -n '2p' student.txt //p: 标识查看文件数据,输出到屏幕,-n标识只显示某一行数据
1 AAA 66 66 66 66
grep:
和正则表达式一起使用,用于文本搜索匹配查询内容等,输出到标准输出。比如:
^ #锚定行的开始 如:'^grep'匹配所有以grep开头的行。
$ #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。
. #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
* #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
.* #一起用代表任意字符。
[] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
[^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
\(..\) #标记匹配字符,如'\(love\)',love被标记为1。
\< #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。
\> #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
x\{m\} #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。
x\{m,\} #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\} #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
\w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
\W #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。
\b #单词锁定符,如: '\bgrep\b'只匹配grep。
awk :
awk options 'pattern {action}' file
其中,options 可以控制 AWK 的行为,pattern 用于匹配输入数据的模式,{action} 是在匹配到模式的行上执行的动作。如果省略 pattern,AWK 将对所有行进行操作;如果省略 {action},默认动作是打印整行。
常用选项参数
-F <分隔符> 或 --field-separator=<分隔符>:指定输入字段的分隔符,默认是空格。
-v <变量名>=<值>:设置 AWK 内部的变量值。
-f <脚本文件>:指定一个包含 AWK 脚本的文件。
-V 或 --version:显示 AWK 的版本信息。
-h 或 --help:显示 AWK 的帮助信息。
实例
#正则表达式需要使用''括起来
grep -n 'the' filename 打印出行号
grep -in 'the' filename 不区分大小写打印出所有含有the的行
grep -o 'the' filename 打印出匹配到的the的内容。
grep -vn 'the' filename 反向查找,打印出不包含the的行的内容
grep -cn 'the' 统计含有the的行的数量
grep -f filename filename2 打印出两个文件相同的内容
grep '^$' filename -n 查找空行
grep '\.$' -n filename 找出.结尾的行
grep '^#' filename -vn | grep '^$' -v //去掉#开头的行和空行
grep -nr "xxx" //当前目录查找文件内容xxx
意思就是通过grep '^#' filename -vn去掉#开头的行,输出到管道,然后再管道中执行grep '^$' -v 去掉空行
sed -n '3,5p' filename 打印3-5行的内容
sed -n '3,5d' filename 删除3-5行的内容
sed 's/e/E/2' filename 将每一行的第二个e替换为E
sed 's/e/E/g' filename 将所有行的e替换为E
sed '/^[a-z]/g' filename 打印出a-z开头的所有行
sed 's/^/#/g' 每一行的行首添加#
sed '/the/s/^/#/g' 将含有the的行的开头添加#
sed '/^$/d' 删除空行
sed '/inux/p' filename -n 输出含有linux的行
sed '/linux/d' filanem 删除含有inux的行。但不修改源文件
sed '/linux/d' filaneme -i 删除含有linux的行,并修改源文件(-i)
sed '4,$d' filaneme -i 删除4行开始到结束的行,并写入文件
sed "4a i am cjjc" filename 往文件第四行的下一行添加i am cjjc
sed "4a i am cjjc" filename -i
sed "a ----------" filename -i 往文件的每一行下方都添加一个----------
sed "4i i am cjjc" filename -i 往文件第四行的上一行添加i am cjjc
#利用sed取出ifconfig eth0中的ip地址
cjjc@cjjc-None:~/Qt5.14.2/Tools/QtCreator/bin$ ifconfig ens33 | sed '2s/^.*inet//p' -n
172.16.1.13 netmask 255.255.255.0 broadcast 172.16.1.255
cjjc@cjjc-None:~/Qt5.14.2/Tools/QtCreator/bin$
ifconfig ens33 | sed '2s/^.*inet//p' -n | sed 's/net.*$//p' -n
172.16.1.13
#就是用ip地址前字符替换成空格,后面的也替换成空格
sed '2s/^.*inet//p' -n //匹配前面任意字符到inet的字符串并替换成空,并且打印出来,
//-n取消sed的默认输出
awk -F" " 空格分割,-F":" :作为分割
awk -F" " '(NR==2){print $1}' awktest.txt /打印第二行第一列
ifconfig ens160|awk -F" " 'NR==2{print "ip:" $2}' //取出ip地址
ifconfig ens160|awk '/netmask/{print "ip:" $2}'//取出ip地址,以netmask作为结束,
//去除前面第二列的数据