Linux 三剑客是(grep,sed,awk)三者的简称,他们通常结合正则一起使用。 grep擅长查找,sed擅长修改文件。awk擅长取列。
一、grep
grep是一个文本过滤工具,可以全局搜索文件中的内容
参数说明
- -v 显示不被pattern匹配到的行
- -o 仅显示匹配到的字符串
- -n 显示匹配的行号
- -i 忽略字符大小写
- -A n 显示后n行
- -B n 显示前n行
- -C n 显示上下n行
- -r 递归查找
案例演示:
① 找出1.txt 中是否有 "are" 字符串,并显示行号
[root@master-129 myshell]# grep -n "are" 1.txt
4:10 There are orange,apple,mongo
② 查询当前目录下面所有的文件是否含有 "are" 字符串
[root@master-129 myshell]# grep -n "are" ./*
./1.txt:4:10 There are orange,apple,mongo
③ 以root开头的行
[root@master-129 myshell]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
二、awk介绍
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。可以理解为字符串进行分组。
-F 后面可以写分隔符
① 显示用户名对应的 uid
cat /etc/passwd | awk -F[:] '{print $1,$3}'
② 显示最后一行,并显示行数
cat /etc/passwd | awk -F[:] '{print $NF,NR}'
-F是根据":" 分组,NF和NR内置参数,NF是列数,NR是行数
③ 用awk统计linux系统中所有的用户数
cat /etc/passwd | awk '{count++}END{ print count}'
④ 统计某个文件夹下文件所占的字节数
ls -l | awk 'BEGIN{size=0}{size=size+$5}END{print size}'
三、sed
是一种支持正则表达式的非交互式流编辑器
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed的常用选项
- -n: 只显示匹配处理的行(否则输出所有)
- -i: 直接在文件中进行修改,而不是输出到屏幕
- -r: 支持扩展正则表达式
- -e: 执行多个编辑命令时(一般用 ; 代替)
① 替换操作:s命令
最常见的替换命令
sed -i 's/a/b/g' 1.txt
-i 直接替换,s//g标准格式 中间的a/b就是 被替换和替换词
当需要从第N处匹配开始替换时,可以使用 /Ng:
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
② 删除操作:d命令
1、删除空白行
sed '/^$/d' file
2、删掉第二行
sed '2d' file
3、删除文件中所有开头是test的行
sed '/^test/'d file
4、删除文件的最后一行
sed '$d' file
sed 功能太多了,最常见的就是替换,这种字符串可以使用php、python脚本去操作,感觉方便一些
四、面试题
① 有1000个文件怎么批量修改, abc批改成aaa
grep "abc" * -R | awk -F: '{print $1}' | sort | uniq | xargs sed -i 's/abc/abcde/g'
xargs命令是传参到命令行
② 分析日志t.log访问量,将各个ip地址进行截取,并统计出现次数,按从大到小排序
http://182.92.175.10:81/index.html
http://182.92.175.11:81/index2.html
http://182.92.175.12:81/index3.html
http://182.92.175.13:81/index4.html
http://182.92.175.14:81/index5.html
http://182.92.175.14:81/index6.html
cat ip.txt | awk -F[/] '{print $3}' | sort | uniq -c | sort -nr
awk 根据 / 分组,输出低3列,进行排序sort,然后根据uniq进行分组,最后sort再排序 -nr
sort -nr表示 -n依照数值的大小排序 -r相反排序从大到小排序
uniq -c命令统计前,比较要先排序。
③ 统计连接到服务器的各个ip情况,并按连接数从大到小排序
netstat -an | grep 'ESTABLISHED' | awk -F " " '{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr
④ 用shell写一个脚本,对无序的一列数字进行排序,并求和
1
1
1
2
2
3
3
3
4
4
5
6
[root@master-129 myshell]# sort -n 2.txt | awk '{sum+=$1;print $1} END {print "和是="sum}'
1
1
1
2
2
3
3
3
4
4
5
6
和是=35
⑤ 统计某个目录下所有的文件个数和所有文件总行数的指令
find /root/myshell/ -name '*.*' | wc -l
find /root/myshell -name '*.*' | xargs wc -l