Linux三剑客

  • grep:擅长单纯的查找或匹配文本内容
  • sed:更适合格式化文本内容,对文本进行复杂处理
  • awk:更适合编辑、处理匹配到的文本内容

    三剑客使用快讯

    gerp(过滤)

    -E 开启扩展正则表达式 -w 显示匹配结果只能是单独的单词
    -n 显示行号 -i 不论内容大小写
    -v 反转内容 -c 显示匹配数量
    “^x” 以什么开头的内容 “x$” 以什么结尾的内容

    sed(替换、删除)

    -n 只剩搜索内容,其他没有进行操作的全不要
    sed -n “/输入你要找的内容,比如^#,以井号开头/p” linaxi.txt
    -i 写入到原文件 p打印 d删除

    awk(高级文本处理)

案例1:(删除文本的空行)

1.用grep方法

grep -v “^$” lianxi.txt #空行的内容的反值 grep “[^^$]” lianxi.txt #不是空行的内容

2.用sed方法

sed “/^$/d” lianxi.txt #取到空行并删除

3.用awk方法

awk ‘!/^$/{print $0}’ lianxi.txt #不是空行的内容打印

案例2:(找出禁止登陆用户)

找出pwd.txt文件中禁止登陆的用户( /sbin/nologin )

  1. 用grep找出

    grep ‘/sbin/nologin$’ pwd.txt

  2. awk用正则得用双斜杠

    awk ‘/\/sbin\/nologin$/{print $0}’ pwd.txt

这里面需要注意的一个是awk调用//双斜杠不要忘了,或者遗漏;另一个是路径中的/是不是和我们awk正则表达冲突了,所以我们要用\来转义,不然就出错了

案例3:(找出文件区间)

正则模式
awk ‘/正则表达式/{动作}’ file.txt
行范围模式
awk ‘/正则1/,/正则2/{动作}’ file.txt

  1. 找出mail用户到nobody用户之间的内容

    awk ‘/^mail/,/^nobody/{print $0}’ pwd.txt

相当于我们利用了两个正则表达式,取两种开头之间的所有内容进行打印

  1. 关系表达式模式

    awk ‘NR>=4 && NR<=8 {print $0}’ pwd.txt

案例4:(日志ip访问量)

进入这个路径 cd /opt/ngx112/logs/ ,就可以看到里面的这个文件 access.log ,里面的内容都是一些访问记录,写了什么ip访问过Nginx软件

sort -n 数字从大到小排序

wc -l 统计行数,也就是ip的条目数

awk ‘{print $1}’ access.log | sort -n | uniq | wc -l

所以,我们知道这个日志文本后,我们进行寻找第一列的ip信息,再进行排序,去重,我们是不是就能得出有多少用户访问过我们的软件了呢?

加深难度:
我们又可以通过排序,显示重复次数,然后再次排序,反转,我们是不是就能够得到访问次数最多的ip地址了呢

awk ‘{print $1}’ access.log | sort -n | uniq -c | sort -nr | head -10