shell编程四剑客find grep awk sed
1.find 文件查找命令(根据文件名称)
查找home目录下名字为test的所有txt文件
find /home/ -name "test.txt"
查找当前路径下,一天内创建的,名字以.txt结尾的目录(f表示文件),并将它复制到tmp目录下
find . -name "*.txt" -type d -mtime -1 -exec cp -r {} /tmp/ \;
查找当前路径下30天以前的后缀是log的文件,然后删除掉
find . -type f -name "*.log" -mtime +30 -exec rm -rf {} \;
2.grep 过滤查找,找文件内容
查找passwd中的root字符并加行号加颜色显示
grep -n --color "root" /etc/passwd
查找文件中不含#的行
grep -v "#" /usr/data.txt
3.awk(噢可) 文本查找处理工具
NR:number of record(行号)
NF:number of field(列号)
显示所有数据并在第一列加上行号
awk '{print NR "\t" $0}' test.txt
显示所有数据并在第一列显示当前行的列数(空格分割为界)
awk '{print NF "\t" $0}' test.txt
查找功能
查找第一列为bob的数据
awk '$1=="bob"{print $0}' test.txt
查找第7行数据
awk 'NR==7{print $0}' test.txt
输入按逗号分割开,输出按制表符分割显示(输入输出分隔符默认都是空格)
awk 'BEGIN{FS=","; OFS="\t"} {print $1, $2}'
将第3列的数据隐藏,显示为xxx
awk '{$3="xxx"; print $0}' data.txt
打出文件的最后一列数据
awk '{print $NF}' data.txt
awk '{a=2; b="apple"; c=3; print b+c}' 输出3,字符串和数字相加会把字符串中的最前面数字部分才会相加,没有数字部分则为0
awk '{a=2; b="32apple"; c=3; print b+c}' 输出35,只有最前面是数字才会相加
Regular Expression(正则表达式)
匹配字符串中含有abc的值
awk '/abc/{print $0}' data.txt
匹配字符串中含有'a+一个任意字符+c'的值
awk '/a.c/{print $0}' data.txt
如果就要匹配'a.c'这个字符串就需要用转义字符
awk '/a\.c/{print $0}' data.txt
^和$ 表示开始和结尾
匹配必须以abc开始的值
awk '/^abc/{print $0}' data.txt
匹配必须以abc结尾的值
awk '/abc$/{print $0}' data.txt
匹配'a+a到z任意一个字符+c'
awk '/a[a-z]c/{print $0}' data.txt
匹配'a+除了小写a到z之外的一个字符+c'
awk '/a[^a-z]c/{print $0}' data.txt
匹配'0个a或者任意个a+b'
awk '/a*b/{print $0}' data.txt
匹配'至少一个a+b'
awk '/a+b/{print $0}' data.txt
匹配'a可以有也可以没有+b'
awk '/a?b/{print $0}' data.txt
匹配'abbbc'
awk '/ab{3}c/{print $0}' data.txt
匹配'a+3个b到10个b+c'
awk '/ab{3,10}c/{print $0}' data.txt
4.sed 数据流编辑器(stream editor行编辑器)
将文本以行为单位加载进内存的模式空间,默认不编辑原文件,仅对模式空间中的数据做处理,之后再显示出来
删除第1行和第2行(d表示删除)
sed '1,2d' test.txt
删除第3行到最后一行($表示最后一行,$-1表示倒数第二行)
sed '3,$d' test.txt
模式匹配,删除包含oot的行
sed '/oot/d' test.txt
显示以/开始的行,会重复显示,因为模式空间还会显示一次,可加'-n'静默模式不显示模式空间的内容
sed '/^\//p' test.txt
在以/开头的行后面加上hello
sed -n '/^\//a \hello' test.txt
把包含oot的行数据保存到etc/fstab中
sed -n '/oot/w test.txt' /etc/fstab
把文件中的oot替换成OOT(默认只替换每行中第一次被匹配的字符串,加了修饰g,全局替换)
sed 's/oot/OOT/g' test.txt
5.几个例子
查找当前目录下包含127.0.0.1关键字的文件
grep -rl '127.0.0.1' ./
find . -type f |xargs grep "127.0.0.1"
find . -type f -exec awk '/127.0.0.1/' {} \;
显示除过第3行到第10行的内容
sed '3,10d' test.txt
awk '!(NR>=3&&NR<=10)' test.txt
显示第3行到第10行的内容
sed -n '3,10p' test.txt
awk 'NR>=3&&NR<=10' test.txt
head -10 test.txt|tail -8
awk 'NR==3,NR==7' test.txt (逗号表示连续,第一次匹配到第二次匹配中间的所有行)
只显示第3行和第10行的内容
awk 'NR==3;NR==10' test.txt (分号表示分隔符,分割多条命令)