翼度科技»论坛 云主机 LINUX 查看内容

Linux文本三剑客

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
目录

一、文本搜索工具--grep

1、简介

grep(Global search REgular expression and Print out the line.)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。Unix的grep家族包括grep、egrepfgrep。Windows系统下类似命令FINDSTR
从grep的全称中可以了解到,grep是一个可以利用""正则表达式"进行"全局搜索"的工具,grep会在文本文件中按照指定的正则进行全局搜索,并将搜索出的行打印出来。
2、工作原理


  • grep读取输入数据,这可以是来自一个或多个文件的内容,也可以是管道(stdin)传入的数据。
  • 它根据提供的模式(pattern),这个模式可以是简单字符串或复杂的正则表达式,逐行匹配文本。
  • 当一行文本与模式匹配时,该行会被输出到标准输出(stdout),默认情况下不改变原始文件。
  • 如果没有找到匹配项,grep可能不会输出任何内容,具体行为取决于使用的选项。
3、语法格式
  1. grep [选项] PATTERN [文件列表]
复制代码

  • grep:命令名称,用于搜索含有特定模式的文件内容。
  • [选项]:可选参数,用来控制搜索的方式、输出格式等。常见的选项包括-i(忽略大小写)、-v(反向匹配)、-n(显示行号)、-r或-R(递归搜索)、-w(精确单词匹配)等。
  • PATTERN:必填项,表示要搜索的模式或正则表达式。这可以是一个简单的文本字符串或复杂的正则表达式,用于匹配文件中的内容。
  • [文件列表]:可选,指定要搜索的一个或多个文件名。如果不提供文件名,grep默认从标准输入(stdin)读取数据,这意味着你可以通过管道(|)将其他命令的输出传递给grep进行搜索。
4、选项介绍

选项描述-i忽略大小写进行匹配。-v反转匹配,输出不匹配指定模式的行。-n在每行匹配之前显示行号。-c计算匹配行的总数,而不是打印匹配行。-o只打印匹配的内容-l只列出包含匹配项的文件名,对于每个匹配的文件只输出一次。-L列出不包含匹配项的文件名。-B打印匹配的前几行-A打印匹配的后几行-C打印匹配的前后几行-w匹配整个单词,即模式必须与整个单词相匹配,而不是单词的一部分。-r 或 -R递归搜索指定目录下的所有文件。-E使用扩展正则表达式(ERE)。-F将模式作为固定字符串对待,不解释为正则表达式。-q静默模式,不输出任何内容到屏幕,仅返回退出状态码。常用于脚本中判断是否存在匹配。-e多点操作5、实例测试

测试文档  test
  1. #!/bin/bash
  2. set -euo pipefail
  3. NGINX_VERSION="1.18.0"
  4. INSTALL_DIR="/apps/NGINX"
  5. #echo "开始安装 Nginx $NGINX_VERSION..."
  6. #echo "1. 安装依赖包..."
  7. if yum list installed $PACKAGE_LIST &> /dev/null; then
  8.     echo "依赖包已安装。"
  9. else
  10.     echo "正在安装依赖包:$PACKAGE_LIST"
  11.     yum -y install $PACKAGE_LIST > /dev/null
  12.     echo "依赖包安$装完成。"
  13. echo "2. 创建非登录用户 NgInX..."
  14. if id -u NgInX &> /dev/null; then
  15.     echo "NgInX 源码下载完成。"
  16. echo "5. 设置#目录#权限..."
  17. chown -R nginx.NGINX "$INSTALL_DIR" > /dev/null
  18. echo "6. 创建符号链#接..."
  19. ln -s "$INSTALL_DIR/sbin/NgInX" /usr/bin/ > /dev/null
  20. echo "符号链$接创建完成$。"
  21. [Install]
  22. [install]
  23. sed -i '/^#pid.*$/a pid        /apps/nginx/run/nginx.pid;' /apps/NGINX/conf/NgInX.conf > /dev/null
  24. echo "NgInX 安$装完成。"
复制代码
5.1、-i选项

打印出所有的nginx,无论大小写
  1. grep -i 'nginx' test
复制代码

5.2、-v选项

打印出所有不包含null的行
  1. grep -v 'echo' test
复制代码

5.3、-n选项

打印所有不包含nginx大小写,并且显示所在行
  1. grep -inv 'nginx' test
复制代码

5.4、-c选项

打印所有不包含echo大小写,并且计算匹配的行的总数
  1. grep -ivc 'echo' test
复制代码

5.5、-o选项

只打印匹配到的NgInX字符串
  1. grep -o 'NgInX' test
复制代码

5.6、-B选项

打印匹配开始安装的前三行
  1. grep -B3 '开始安装' test
复制代码

5.7、-A选项

打印匹配开始安装的后三行
  1. grep -A3 '开始安装' test
复制代码

5.8、-C选项

打印匹配开始安装的前后两行
  1. grep -C2 '开始安装' test
复制代码

5.9、-w选项

打印完全匹配NgInX字符串的行
  1. grep -w 'NgInX' test
复制代码
5.10、-E选项

过滤test文件中所有的空行、注释#
  1. egrep -v '^#|^$' test
  2. grep -Ev '^#|^$' test
复制代码

5.11、-e选项

同时查找包含"安装"和"NgInX"的行
  1. grep -e '安装' -e 'NgInX' test
复制代码

二、流编辑器--sed

sed操作文件前记得备份源文件,或者先使用默认的-e参数操作
1、简介

sed全称为Stream EDitor,行编辑器,同时也是一种流编辑器。是一个强大的非交互式命令行工具,主要用于自动地对文本文件或者输入流进行基于模式的查找、替换、删除、插入等操作。
2、工作原理


  • 读取行:sed逐行读取输入文件(或从标准输入接收到的数据)。每次读取一行内容,不会一次性将整个文件加载到内存中,这使得sed在处理大文件时效率很高。
  • 模式空间:读取的每一行文本会被放置到一个称为“模式空间”(pattern space)的缓冲区中。模式空间是sed进行文本处理的主要场所,所有的编辑命令都在这里对文本行进行操作。
  • 执行命令:根据提供的命令脚本,sed会对模式空间中的文本行进行匹配、替换、删除等操作。这些命令可以是简单的正则表达式匹配,也可以是复杂的逻辑判断和操作序列。
  • 输出处理结果:处理完一行后,sed会将模式空间中的内容输出到屏幕(或重定向的输出文件),然后清空模式空间(除非使用特殊命令如H、G、N、D等操作了保留空间hold space),准备处理下一行。这个过程重复,直到所有行都被处理完毕。
  • 保留空间:除了模式空间,sed还有一个称为“保留空间”(hold space)的缓冲区,它可以用来临时存储数据,实现更复杂的文本处理逻辑,比如在多行间传递数据。
  • 非破坏性处理:默认情况下,sed不对原文件进行修改,而是将处理后的结果输出到标准输出。如果你想修改原文件,可以使用-i选项进行就地编辑。
  • 退出处理:当文件的所有行都被成功处理并输出后,sed完成其任务并退出。
3、语法格式


  • sed的命令格式:

      1. sed [option] 'sed command' 输入文件
      复制代码

  • sed的脚本格式

      1. sed [option] ‐f 'sed script' 输入文件
      复制代码

4、选项介绍

选项描述-n抑制自动打印模式空间的内容,仅打印通过命令显式指定的内容。-e添加脚本到执行的命令列表中,允许多个-e选项串联多个脚本。-f从指定的脚本文件中读取命令并执行。--follow-symlinks处理文件时跟随符号链接。-i直接修改文件内容。-c在使用-i模式时,使用复制而非重命名来处理文件。-b对于某些平台,打开文件时使用二进制模式,但实际上不起作用。-l N为l命令指定期望的行宽包装长度。--posix禁用所有GNU扩展,使用POSIX兼容模式。-r使用扩展正则表达式。-s将每个文件视为独立的,而非一个连续的长流。-u减少从输入文件加载的数据量,并更频繁地刷新输出缓冲区,适合处理大文件或需要即时输出的情况。-z使用NUL字符而不是换行符作为行分隔符。--help显示帮助信息并退出。--version输出版本信息并退出。5、动作介绍

动作描述=打印当前处理的行号。a \text在当前行之后追加文本text,文本中的换行需用\转义。i \text在当前行之前插入文本text,文本中的换行需用\转义。q [exit-code]立即退出sed脚本,可选指定退出代码。Q [exit-code]GNU扩展,立即退出sed脚本,不处理剩余输入,可选指定退出代码。r filename读取文件filename的内容并追加到模式空间处理后的输出中。R filenameGNU扩展,读取文件filename的一行并追加到模式空间处理后的输出中,每次调用读取一行。{ ... }定义一个命令块,其中可以包含多条sed命令。b label无条件跳转到标签label处,或如果没有指定标签,则跳到脚本末尾。c \text用text替换当前模式空间中的行,文本中的换行需用\转义。d删除模式空间中的当前行,然后开始处理下一行。D如果模式空间中没有换行符,就像执行了d命令;如果有换行符,删除至第一个换行符前的内容并重新开始处理。h H复制模式空间内容到保持空间(h)或追加到保持空间(H)。g G用保持空间的内容替换模式空间内容(g)或追加保持空间内容到模式空间(G)。l以一种视觉上不易混淆的形式列出模式空间中的当前行。l widthGNU扩展,按指定宽度width折行显示模式空间中的当前行。n N读取下一行到模式空间(n)或追加下一行到模式空间而不启动新循环(N)。p打印当前模式空间的内容。P打印模式空间中的内容直到第一个换行符。s/regexp/replacement/替换与正则表达式regexp匹配的部分为replacement,&在替换中表示匹配的文本,\1到\9表示捕获组。t label如果最近的替换成功,则跳转到标签label。T labelGNU扩展,如果最近的替换未成功,则跳转到标签label。w filename将模式空间的内容写入文件filename。W filenameGNU扩展,将模式空间的第一行写入文件filename。x交换模式空间与保持空间的内容。y/source/dest/对模式空间中的字符进行转换,将source中每个字符转换为dest中对应位置的字符。6、sed的增删改查

以下所有的命令皆不使用-i选项修改仅供展示
测试文档:
  1. [root@localhost ~]# cat /etc/passwd > test01
  2. [root@localhost ~]# cat test01
  3. root:x:0:0:root:/root:/bin/bash
  4. bin:x:1:1:bin:/bin:/sbin/nologin
  5. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  6. adm:x:3:4:adm:/var/adm:/sbin/nologin
  7. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  8. sync:x:5:0:sync:/sbin:/bin/sync
  9. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  10. halt:x:7:0:halt:/sbin:/sbin/halt
  11. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  12. operator:x:11:0:operator:/root:/sbin/nologin
  13. games:x:12:100:games:/usr/games:/sbin/nologin
  14. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  15. nobody:x:99:99:Nobody:/:/sbin/nologin
  16. systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
  17. dbus:x:81:81:System message bus:/:/sbin/nologin
  18. polkitd:x:999:998:User for polkitd:/:/sbin/nologin
  19. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  20. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  21. chrony:x:998:996::/var/lib/chrony:/sbin/nologin
复制代码
6.1、增

"a":apend,追加,追加文本到指定行后。
"i":insert,插入,插入文本到指定行前。
6.1.1、在test01文件的第一行后面追加3行数字


    1. sed '1a 111\n222\n333' test01
    复制代码

6.1.2、在行首添加一行数字


    1. sed '1i 111' test01
    复制代码

6.2、删

"d":delete,删除文本
6.2.1、删除第一行


    1. nl test01 | sed '1d'
    复制代码

6.2.2、删除2-10行


    1. nl test01 | sed '2,10d'
    复制代码

6.2.3、删除全文


    1. sed 'd' test01
    复制代码
6.2.4、删除匹配到/sbin/nologin的行


    1. sed '/\/sbin\/nologin/d' test01
    复制代码

6.2.5、删除以bin开头的行


    1. sed '/^bin/d' test01
    复制代码

6.2.6、删除第三行到末尾


    1. nl test01 | sed '3,$d'
    复制代码

6.2.7、删除第1-3行以外的行


    1. nl test01 | sed '1,3!d'
    复制代码

6.2.8、去除文件中的空行和注释行


    1. sed -e '/^#/d' -e '/^$/d' test01
    复制代码
6.3、改

"c":change,替换
6.3.1、将第一行替换为 hello sed


    1. sed '1c hello sed' test01
    复制代码

6.4、文本替换


  • 选项:

    • "s": 这是sed中最常用的命令,代表替换(substitute)。当你希望在文件中查找并替换某些文本时,就会用到这个命令。例如,s/old/new/ 表示将每一行中首次出现的"old"字符串替换为"new"。这里的"old"是你要查找的目标文本,而"new"是你希望替换成的新文本。
    • "g": 这是一个修饰符,用于指示sed进行全局替换(global)。如果不加"g",sed只会在每行的第一个匹配处进行替换。加上"g"后,sed会在同一行内所有匹配到的目标内容都进行替换。所以,s/old/new/g 表示将每行中所有出现的"old"都替换为"new"。

  • 替换语法(-i选项慎用):

      1. sed -i 's/目标内容/替换内容/g' file
      复制代码
      1. #本质上与上面的命令差不多,更改分隔符为#可以避免转义的复杂性,使命令更易读
      2. sed -i '#/目标内容#替换内容/g' file
      复制代码

6.4.1、将所有的nologin替换为login


    1. sed 's/nologin/login/g' test01
    复制代码

6.4.2、将所有的/sbin/nologin 替换为/bin/login


    1. sed '/\/sbin\/nologin/s#/sbin\/nologin#/bin/login#g' test01
    复制代码

6.4.3、匹配以mail开头的行,将该行所有的mail替换为gmail


    1. sed '/^mail/{s#mail#gmail#g}' test01
    复制代码

6.5、查

"p":print,打印,输出指定内容
配合-n取消默认输出
6.5.1、显示第二行(包括模式空间文件)


    1. sed '2p' test01
    复制代码

6.5.2、只显示第二行


    1. sed -n '2p' test01
    复制代码

三、文本处理工具--awk

1、简介

awk不仅仅是 linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用。
2、工作原理



  • 1、通过关键字 BEGIN 执行 BEGIN 块的内容,即 BEGIN 后花括号 {} 的内容。
  • 2、完成 BEGIN 块的执行,开始执行body块。
  • 3、读入有 \n 换行符分割的记录。
  • 4、将记录按指定的域分隔符划分域,填充域,$0 则表示所有域(即一行内容),\(1** 表示第一个域,**\)n 表示第 n 个域。
  • 5、依次执行各 BODY 块,pattern 部分匹配该行内容成功后,才会执行 awk-commands 的内容。
  • 6、循环读取并执行各行直到文件结束,完成body块执行。
  • 7、开始 END 块执行,END 块可以输出最终结果。
3、语法格式


  • awk指令是由模式,动作,或者模式和动作的组合组成。
  • 模式即pattern,可以类似理解成sed的模式匹配,可以由表达式组成,也可以是两个正斜杠之间的正则表达式。比如NR==1,这就是模式,可以把他理解为一个条件。
  • 动作即action,是由在大括号里面的一条或多条语句组成,语句之间使用分号隔开。
  1. awk [options] 'pattern {action}' file
复制代码

<blockquote>
awk处理的内容可以来自标准输入(

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具