Linux 三剑客grep 、sed、awk

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

你可能感兴趣的:(Linux,linux,debian,运维)