• Shell 文本三剑客 (grep、sed、awk)


    目录

    正则表达式定义

    Linux三剑客(grep、sed、awk)

    一、grep

    元字符

    基本用法

    选项

    应用 

    二、sed

    1、工作流程

    2、命令格式

    3、常用选项

    使用地址

    删除行

    4.sed案例

    1、sed -n 用法

    三、awk

    1、工作原理:

    2、命令格式

    3、常见的内置变量

    4.awk的例子

    (1)、awk按列输出   



    正则表达式定义

    正则表达式又称正规表达式、常规表达式。在代码中常简写为 regex、regexp 或 RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串简单来说, 是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

    正则表达式是:由普通字符与元字符组成的文字模式

    普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符

    正则表达式一般用于脚本编程与文本编辑器中

    Linux三剑客(grep、sed、awk)

    支持的正则表达式

    脚本的内容一般都会比较多,但是我们不会每次都通过vim命令进入脚本来对其进行查询或修改,因此我们可以通过命令直接对脚本的内容来进行查询、过滤与修改。

    ​​​​​​​

    支持正则的shell命令正则类型
    grep默认使用基本正则表达式(BRE)(要使用扩展正则需要加转义字符)
    egrep 或grep -E使用扩展的正则表达式(ERE)
    sed默认使用基本正则表达式(BRE)
    awk使用扩展正则表达式(ERE)

    一、grep

    grep [选项]  [查找条件(正则)]  [目标文件]

    常用选项功能
    -n列出所匹配的文本行,并显示行号
    -i匹配时忽略字符大小写
    -v反向匹配,匹配的字符串与搜索的不相符
    -w精确匹配。匹配整个单词、 一个字符
    -o只显示匹配的部分
    -c显示匹配内容的行数
    -E开启扩展的正则表达式
    --color=auto可以将找到的关键词部分加上颜色的显示!

    元字符

    ^    匹配输入字符串的开始位置。除非在方括号表达式中使用,表示不包含该字符集合。要匹配"^"字符本身,需要转移"\^"
    $   匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则"$"也匹配'\n'或'r'
    .   “.”代表除"\n\s"之外的任何单个字符
    \   反斜杠,又叫转义字符,去除其后紧跟的元字符或通配符的 特殊意义
       匹配前面的子表达式零次或多次。要匹配"*"字符,要进行\转移
    [ ]   字符集合,匹配所包含的任意的一个字符
    [^]   复制字符集。匹配未包含在[ ]内的任意一个字符
    [n1-n2]字符范围。匹配指定范围内的任意一个字符。例如[a-z]可以匹配到a到z范围内的任意一个小写字母字符
    {n}   n是一个非负整数,匹配确定的n次,例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配到“food”中的“oo”
    {n,}    n是一个非负整数,至少(最少)匹配n次。例如,“o{2,}”不能匹配"Bob"中的“o”,但是能匹配“fooooood”中的所有o。“o{1.}”等于“o+”
    {n,m}    n和m均为非负整数,其中n<=m,最少匹配n次,最多匹配m次

    基本用法

    grep 选项 文件

    过滤文本中的字符串

    命令产生的字符

    选项

    1. grep [选项] 查找条件 目标文件
    2. -i:查找时忽略大小写
    3. -v:反向查找,输出与查找条件不相符的行
    4. -o 只显示匹配项
    5. -f 对比两个文件的相同行
    6. c 匹配的行数

    应用 

    1. 选项:
    2. -color=auto 对匹配到的文本着色显示
    3. -m 匹配一定次数后停止
    4. -v 显示不被pattern匹配到的行,即取反
    5. -i 忽略字符大小写
    6. -n 显示匹配的行号
    7. -C 统计匹配的行数
    8. -o 仅显示匹配到的字符串
    9. -q 静默模式,不输出任何信息
    10. -A after, 后多少行
    11. -B before, 前多少行
    12. -C context, 前后各多少行
    13. -e 实现多个选项间的逻辑or关系
    14. -W 匹配整个单词
    15. -E 使用ERE, 相当于egrep
    16. -F 不支持正则表达式,相当于fgrep
    17. -f file根据模式文件,处理两个文件相同内容把第一个文件作为匹配条件
    18. -r 递归目录,但不处理软链接
    19. -R 递归目录,但处理软链接

     

     

     

     

     综合应用

     

    二、sed

    1、工作流程

    • 读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
    • 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
    • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

    2、命令格式

    1. sed -e '编辑指令' 文件1 文件2...
    2. sed -n -e '编辑指令' 文件1 文件2...
    3. sed -i -e '编辑指令' 文件1 文件2...
    4. ###编辑命令格式
    5. 地址:可数字、正则表达式、$,没有地址代表是所有行
    6. 操作:可以使a、c、d、p、r、w、s、y等
    7. 参数:一般有g,代表只要符合条件的全部进行处理

    3、常用选项

    1. ##参数说明:
    2. -e:指定要执行的命令,只有一个编辑命令时可以省略
    3. -n:只输出处理后的行,读入时不显示
    4. -i:直接编辑文件,而不输出结果
    5. -f:用指定的脚本文件来处理输入的文本文件
    6. -s:将多个文件视为独立文件,而不是单个连续的长文件流
    7. ##动作说明
    8. a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
    9. c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
    10. d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
    11. i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
    12. p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
    13. s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
    14. 例如 1,20s/old/new/g

    使用地址

    sed编辑器有两种寻址方式

    1.以数字形式表示行区间

    2.用文本模式来过滤出行

    1. [root@localhost ~]# sed -n '1p' one.sh #打印第一行内容
    2. one
    3. [root@localhost ~]# sed -n '$p' one.sh #打印最后一行的内容
    4. five
    5. [root@localhost ~]# sed -n '1,3p' one.sh #打印1~3行的内容
    6. one
    7. two
    8. three
    9. [root@localhost ~]# sed -n '3,$p' one.sh #打印第3行到最后一行的内容
    10. three
    11. four
    12. five
    13. [root@localhost ~]# sed -n '1,+3p' one.sh #打印1之后的连续3行,即1~4
    14. one
    15. two
    16. three
    17. four
    18. [root@localhost ~]# sed '5q' one.sh #打印前5行信息后退出,q表示退出
    19. one
    20. two
    21. three
    22. four
    23. five
    24. [root@localhost ~]#
    25. [root@localhost ~]# sed -n 'p;n' one.sh #打印奇数行
    26. one
    27. three
    28. five
    29. [root@localhost ~]# sed -n 'n;p' one.sh #打印偶数行
    30. two
    31. four
    32. [root@localhost ~]# sed -n '2,${n;p}' one.sh
    33. three
    34. five
    35. #从第二行开读取到最后一行,但是碰到n就是直接移动到下一行遇到p打印,开始读取形成了循环,以此类推打印奇数行
    36. [root@localhost ~]# sed -n 'p;n;p' one.sh
    37. one
    38. two
    39. three
    40. four
    41. five
    42. [root@localhost ~]# sed -n 'n;p;n' one.sh
    43. two
    44. five
    45. #简单来说n是不打印p是打印,循环就是npnnp,所以25就打印出来了

    删除行

    1. sed 'd' 文件名 #全删
    2. sed '3d' 文件名 #删除第3行
    3. sed '1d;$d' 文件名 #删除第一行与最后一行
    4. 去除空行:
    5. grep -v "^$" 文件名
    6. cat 文件名 | tr -s "\n"
    7. sed '/^$/d' 文件名 #加i执行
    8. sed '/nologin$/!d' /etc/passwd #删除/etc/passwd中除了nologin结尾以外所有的行
    9. sed '/2/,/3/d' 文件名 #从第一个位置打开行删除功能,到第二个位置关闭行删除功能

    4.sed案例

    1、sed -n 用法

    sed '3p' 2.txt   第3行自动打印

     sed -n "3p" 3.txt  等同于 cat test.txt             sed -n 关闭自动打印

    三、awk

    1、工作原理:

    逐行读取文本,默是认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。

    • awk是是一个强大的编辑工具
    • 是无交互情况下实现复杂的文本操作

    2、命令格式

    1. awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2
    2. awk -f 脚本文件 文件 1 文件 2

    3、常见的内置变量

    FS:指定每行文本的字段分隔符,缺省为空格或制表位(tab)

    OFS:输入字段的分割符(默认是空格)

    NF:当前处理的行的字段个数

    NR:当前处理的行的行号(序数)

    FNR:读取文件的记录行号(从1开始,若读取新的文件依旧是从1开始)

    ORS:输出行的分割符,默认为换行符

    RS:行分隔符,根据RS的定义把资料切割成许多条记录

    $0:当前处理的行的整行内容

    $n:当前处理行的第n个字段(第n列)

    1. #打印出所有内容并且输出行号
    2. [root@yzy ~]# awk -F: '{print NR,$0}' one.sh
    3. 1 one
    4. 2 two
    5. 3 three
    6. 4 four
    7. 5 five
    8. 6 six
    9. 7 seven
    10. 8 eight
    11. 9 nine
    12. 10 ten
    13. 11 eleven
    14. 12 twelve

    4.awk的例子

    (1)、awk按列输出   

    指定分隔符 打印第1 2 3列  head /etc/passwd | awk -F: '{print $1,$2,$3}

     指定分隔符输出第3列大于1000                       awk -F: '$3>1000' /etc/passwd

     指定分隔符输出第3列<5的,且打印第1 3 列      awk -F: '$3<5{print $1,$3}' /etc/passwd

     查找本机ip                         ifconfig  ens33 | awk '/netmask/ {print $2}'

     

     指定x为分隔符打印第1列            head /etc/passwd | awk -Fx '{print $1}' 

      输出时用空格隔开需要在$直接加逗号(,)       head /etc/passwd | awk -F: '{print $1,$2,$3}'

     列之间插入制表符 “\t”     head /etc/passwd | awk -F: '{print $1"\t"$2"\t"$3}'

      . 为分割   awk -F. '{print $2}' 3.txt

  • 相关阅读:
    Java 诊断工具 Arthas 进阶教程
    Gitlab 数据备份和还原(填坑版)
    【vue基础】v-if和v-show的区别;v-for更新检测($set强制更新);计算属性的get与set方法;侦听器与计算属性区别;
    C++二级题目6
    计组作业&笔记【 总线 】
    Mybatis
    一例恶搞的样本的分析
    在Thymeleaf中格式化日期
    msfvenom制作主控与被控端
    【Kafka专题】Kafka集群架构设计原理详解
  • 原文地址:https://blog.csdn.net/z20021111/article/details/126233724