ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

shell学习第七天之Linux三剑客grep,sed,awk

2021-12-01 16:30:53  阅读:127  来源: 互联网

标签:shell grep print etc sed awk test txt 三剑客


三剑客之一-----sed

  • sed [选项] '命令' 文件路径

    • 选项
      选项作用
      -r支持扩展元字符
      -i写入文件,即操作会保存
      -e可以指定多个命令,也可用“;”分割多个命令,按顺序执行
      -n静默模式,取消默认控制台输出
    • 命令
      命令作用例子
      a追加内容sed ‘3a Hi’ test.txt
      d删除sed ‘3,5d’ test.txt
      s匹配局部替换sed ‘s/hi/nihao/’ test.txt
      c匹配到的整行替换sed ‘2c this is a text.’ test.txt
      p打印,可与选项-n结合使用sed -rn ‘3,5p’ test.txt
      r读文件sed ‘/nihao/r test1.txt’ test.txt
      w写文件sed ‘3,5w test1.txt’ test.txt
  • 地址(定址)
    地址用于决定对那些进行编辑。地址形式可以是数字,正则表达式,或两者的结合,正则要用“/模式/”格式。如:

    • sed -r ‘3,$d’ test.txt ----->删除第三行到最后一行
    • sed -r ‘3,10d’ test.txt ----->删除第三行到第十行
    • sed -r '3,+10d' test.txt ----->删除第三行和后面的十行
  • 暂存空间

    命令模式作用例子
    h将模式空间内容到的存入暂存空间(覆盖)sed -r ‘3h’ test.txt
    H将模式空间内容到的存入暂存空间(追加)sed -r ‘3H’ test.txt
    g将暂存空间的内容复制到模式空间(覆盖)sed -r ‘1h;3g’ test.txt
    G将暂存空间的内容复制到模式空间(追加)sed -r ‘1h;3G’ test.txt
    x暂存空间内容与模式空间内容互换sed -r ‘3h;4x’ test.txt
  • sed中使用外部变量

    • sed -ri ‘4a$var1’ test.txt ,单引号中的$var1不行
      应该sed -ri “4a$var1” test.txt,或者sed -ri '4a'"$var1"
    • sed -ri “$a$var1” test.txt,会出现歧义,应该sed -ri "\$a$var1" test.txt
  • sed常见操作

    • sed -r ‘3s/[ \t]*#*/#/’ test.txt ----->给第三行加注释,有则不加

三剑客之一-----grep

  • 分类
    • grep:支持基本的正则元字符
    • egrep:支持扩展的元字符
    • fgrep:不支持元字符,字面解释所有的字符
  • grep [选项] 模式 文件1 文件2…
    找到:返回0
    没找到:返回1
    找不到指定文件:2
  • 选项
    选项作用
    -iignore,忽略大小写
    -l只列出匹配行所在的文件名
    -qquit,静默
    -v反向查找,只显示不匹配的行
    -R,-r递归针对目录
    -Aafter,显示匹配到行的后面指定行数
    -Bbefore,显示匹配行的前面指定行数
    -Ccontext,显示匹配行的前后指定行数

三剑客之一------awk

  • 语法形式:awk [options] 'commands' filenames,与sed一样,也是一行一行(一行为一个记录)处理文件
    • option:-F , 定义输入字段分隔符,默认的分隔符是空格或制表符(tab)
    • commands,包括三部分:
      BEGIN{} {} END{}
      行处理前 行处理 行处理后
      eg: awk ‘BEGIN{print “start”} {print “ok”} END{print “end”}’ /etc/hosts
      效果如下:
      在这里插入图片描述
  • 记录与字段相关的内部变量
    变量作用实例
    $0awk变量$0保存当前记录的内容awk ‘{print $0}’ /etc/passwd
    NR当前记录所在行数,每个文件都从1开始awk ‘{print NR,$0}’ test.txt /etc/passwd
    FNR当前记录所在行数,文件之间是连贯的awk ‘{print NR,$0}’ test.txt /etc/passwd
    NF当前记录的字段数awk ‘{print $NF}’ /etc/passwd
    FS输入字段分隔符默认是空格或制表符,可以修改
    OFS输出字段分隔符默认是空格
    RS输入记录分隔符,默认是换行符,即一行一个记录,依次对行处理awk ‘BEGIN{RS=":"} {print $0}’ /etc/passwd
    ORS输出记录之间的的分隔符,默认是换行符awk ‘BEGIN{ORS=""} {print $0}’ /etc/passwd
  • 格式化输出
  • print函数,类似python中的函数,默认换行
    eg:awk -F: ‘{print “用户:” $1}’ /etc/passwd
  • printf函数,类似C语言中的函数,默认不换行,-表示左对齐,默认右对齐
    eg: awk -F: ‘{printf “%-10s,%-5s,%-5s\n”,$1,$,2,$3}’ /etc/passwd
  • 模式和动作
    • 正则表达式

    • 匹配记录(整行), eg : awk ‘/^root/’ /etc/passwd

    • 匹配字段 (~,!~)eg : awk -F ‘$1 ~ /^hxd/’ /etc/passwd

    • 比较表达式,包括 < , > , = , != , <= , >=
      eg : awk -F":" '$3==0 ’ /etc/passwd

    • 条件表达式,if else,if else if else,while,for 均适用

      • awk ‘{if() {} else {}}’ filename
      • awk ‘{if () {} else if () {} else {}}’ filename
      • awk ‘{while () {}}’ filename
      • awk ‘{for () {}}’ filename
    • 算数运算,包括 + - * / % ^(幂)
      eg : awk -F":" ‘$3 * 10 >500’ /etc/passwd

    • 逻辑操作符和复合模式

      • $$----->逻辑与,eg : awk -F":" ‘$1 ~ /root/ && $3<=15’ /etc/passwd
      • || ----->逻辑或,eg : awk -F":" ‘$1 ~ /root/ || $1 ~ /hxd/’ /etc/passwd
      • ! ------>逻辑非,eg : awk -F":" ‘!($1 ~ /root/ || $1 ~ /hxd/)’ /etc/passwd
    • 范围模式,eg : awk -F":" ‘/^root/,/^hxd/’ /etc/passwd ,匹配从root开始的行到hxd开始的行

    • 三目运算符a?b:c , eg : awk -F ‘{print($7>$10 ? “high” $7 : “high” $10)}’ filedata

    • awk内部的数组
      就类似于C语言中的数组

      • 遍历数组:awk -F":" '{ username[x++]=$1} END{for (i in username) {print username[i]} }' /etc/passwd
      • 计数器:awk -F":" '{shells[$NF]++} END{for (i in shells) {print "shell:",i,"num:",shells[i]} }' /etc/passwd
    • 注意:

      • awk里面这个{}里面的多条命令应用分号隔开
      • 里面定义的变量输出时不需要加$

标签:shell,grep,print,etc,sed,awk,test,txt,三剑客
来源: https://blog.csdn.net/weixin_47024013/article/details/107386323

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有