• Linux三剑客:grep,sed,awk


    grep

    https://www.jianshu.com/p/cead2c420536 (简书)

    grep [-acinv] [--color=auto] '[搜寻字符串]' filename
    选项与参数:
    -c : 计算找到 '搜寻字符串' 的次数 -i : 忽略大小写 -n : 输出行号 -v : 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行 --color=auto : 可以将找到的关键词部分加上颜色的显示 -An : 显示匹配行和后面的n行 -Bn : 显示匹配行和前面的n行 -n : 显示匹配行和前后n行,默认0
    -I : 忽略二进制文件 -r -R : 递归查找 -L : 只输出匹配到的文件,会使-n无效

    不常用:
    -G : 基础正则匹配 -E : 扩展正则匹配 等效 egrep -F : 匹配多字符串模式只能找固定的文本 等效 fgrep
    -a : 将 binary 文件以 text 文件的方式搜寻数据
    -V :版本

    搜索关键词

    # 将/etc/passwd 中含有 root 的行都显示出来
    grep root /etc/passwd
    # 将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
    grep -n root /etc/passwd
    # 将/etc/passwd,将没有出现 root 的行取出来
    grep -v root /etc/passwd
    # 将/etc/passwd,将没有出现 root 和nologin的行取出来
    grep -v root /etc/passwd | grep -v nologin
    # 用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示
    sudo dmesg | grep -n --color=auto 'eth'
    # dmesg 列出核心信息,筛选出带有 `eth`的信息,列出 前2行(B before),后3行(A after)数据
    sudo dmesg | grep -n 'eth' -A3 -B2
    # dmesg 列出核心信息,筛选出带有 `eth`的信息,列出 前后5行数据
    sudo dmesg | grep -5 'eth'
    #过滤空行和注释并显示行号
    grep -Env "^$|[#;]"

    根据文件内容递归查找目录

    # 递归当前目录及其子目录下搜索带有 "echo" 行的文件
    grep -r "echo" dirname
    # 递归当前目录及其子目录下搜索带有 "echo" 行的文件, 但是不显示匹配的行,只显示匹配的文件
    grep -r -L "echo" dirname #只显示文件
    grep -r -n "echo" dirname #只文件的行号

    sed

    参考:

    https://www.cnblogs.com/ginvip/p/6376049.html (博客园)

    https://www.runoob.com/linux/linux-comm-sed.html (菜鸟教程)

    语法:
    sed [option] [-e<script>][-f<script文件>][文本文件] //选项 -n 只能打印 -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -i 编辑模式,可以直接修改文件;危险参数 //动作说明 [n|n1,n2]a :新增 ,a 的后面可以接字串,而这些字串会在新的一行出现,对每行起作用,默认所有行 [n|n1,n2]i :新增,i 的后面可以接字串,而这些字串会在新的一行出现,对每行起作用,默认所有行 [n|n1,n2]c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行,对设置的行统一取代 [n|n1,n2]d :删除,d 不需要接内容 [n|n1,n2]s/search/replace/ :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行,

    实例

    #sed -n 
    sed -n p file #查看内容,一般和-n一起用,否则出现双份
    sed -n 3p file #查看第3行的内容
    sed -n 5,8p file #查看第5行到第8行的内容
    sed -n 2,+5 file #查看第2行和后面5行的内容,不能-5
    sed -n /search/p file #搜索内容并打印
    sed -n /search1/,/search2/p file #打印从包含search1的行开始到包含search2的行结束 ,
    #search1的行匹配后,search2的匹配会从下一行开始,如果没有找到匹配到最后一行,
    #search都可以换位n行; #sed -e可以省掉-e ,不改变源文件 sed [n|n1,n2]acontent file #在[指定行|从n1行到n2行之间]所有行后面添加,对每行添加 sed [n|n1,n2]icontent file #在[指定行|从n1行到n2行之间]所有行前面添加,对每行添加 sed [n|n1,n2]ccontent file #替换[指定行|从n1行到n2行之间]所有行的内容,不是每行替换而是全部被替换只剩一行 sed s/search/replace/ file #在[指定行|从n1行到n2行之间]所有行中搜索和替换,对每行替换 sed d file #删除[指定行|从n1行到n2行]全部行 #sed -i 编辑文件,会改变源文件 sed -i [n|n1,n2]acontent file #在[指定行|从n1行到n2行之间]所有行后面添加,对每行添加 sed -i [n|n1,n2]icontent file #在[指定行|从n1行到n2行之间]所有行前面添加,对每行添加 sed -i [n|n1,n2]ccontent file #替换[指定行|从n1行到n2行之间]所有行的内容,不是每行替换而是全部被替换只剩一行 sed -i s/search/replace/ file #在[指定行|从n1行到n2行之间]所有行中搜索和替换,对每行替换 sed -i d file #删除[指定行|从n1行到n2行]全部行

    #增加或修改为多行
    sed aline1\nline2 #可以添加多行使用 \n 分行

    #注意点
    1,sed不能编辑空文件;因为sed是基于流的
    2,a,i,c,s后面的可加可不加
    3,多行内容 \n

    awk

    参考:https://blog.51cto.com/fanqie/1650244 (51博客)

    参考:https://www.runoob.com/linux/linux-comm-awk.html (菜鸟教程)

    语法:
    awk 'BEGIN{ commands } [option] { commands } END{ commands }'
    [option]
    -F #设置分隔符
    -v #设置变量
    -f #设置awk脚本
    
    内建变量
    FS #分隔符,默认是空格,可以是任意字符或者正则表达式
    OFS #输出分隔符即连接符,awk -F':' 'BEGIN{OFS="=";}{print $3,$4;}' /etc/passwd
    RS #定义一行,默认一行就是一行,相当于RS='
    ',结合FS,可以随意分割一个文本
    ORS #输出每行分隔符,即行与行的连接符
    
    NR #当前第几行
    FNR #当前文件第几行 ,如果处理多个文件的时候,FNR表示当前文件的第几行,NR表示总第几行
    NF #当前行被分割的总记录数,所以每行的最后一个可表示为$NF
    FILENAME #当前输入文件的名字
    //实例
    # 行匹配语句 awk '' 只能用单引号 
    $ awk '{print $1,$4}' log.txt awk -F 
    
    #-F相当于内置变量FS, 指定分割字符为 ,
    awk -F, '{print $1,$2}' log.txt awk -v 
    awk -F" *" //多空格当,-F后面跟着一个以上字符时,这个字符串被当成正则表达式
    awk -F' {2,}' '{print $5}' //最少2个空格
    
    # 设置变量 
    awk -va=1 '{print $1,$1+a}' log.txt 
    
    awk -f {awk脚本} {文件名} 
    awk -f cal.awk log.txt

    非常实用的组合

    #结合ps grep kill awk批量删除进程
    ps aux|grep php|grep Cloud|awk '{print $2}'|xargs kill -9

    awk很香

  • 相关阅读:
    处理在finally中出现的异常(Java)
    【转】alt和title属性的区别及应用
    IE6下兼容CSS属性minheight的解决办法
    javascript中判断字符串是否以指定字符串开始或结尾
    IE6兼容改造中的反思
    字符操作函数
    魔术公式
    抽象类和纯虚函数
    悬空指针
    重载
  • 原文地址:https://www.cnblogs.com/tkzc2013/p/13678890.html
Copyright © 2020-2023  润新知