文本处理三剑客 (初识篇)

本文介绍了Linux中用于文本处理的三个重要工具:sed、awk和grep。sed擅长流式编辑,能按行处理文件,适合处理大文件;awk主要适用于格式化处理,其规则包括定位和命令,可以处理有规律的文本;grep则专注于过滤功能,能够快速过滤出含有特定字符串的行。文章通过实例展示了这三个工具的用法和组合使用,如行号定位、正则表达式匹配等。

一、sed

sed对比vim

1、sed可以把处理文件的规则事先写好,然后用同一套规则编辑多个文件

      而vim只能一个个编辑

2、sed处理文件,一次只处理一行,即同一时间内存中只有文件的一行内容

      无论文件多大,都不会对内存造成过大的压力===》用于处理大文件

      如何用sed

什么是sed?

  sed======》流式编辑器

  命令格式:

   sed 选项 ‘规则’ 文件路径

     选项 : -i(改变流向输出,把输出到屏幕中的内容:规则处理的结果+默认输出的结果)

               -n(取消默认输出)

     命令:d (删除)

                p   (整行)

     规则:定位+命令

               定位方式:

                     行号定位

                     [root@@321 ~]# sed -n '1p' 2.txt (其中-n取消了默认输出,‘1p’为指定文件内第一行内容)
                     root:x:0:0:root:/root:/bin/bash
                   

                     [root@@321 ~]# sed -n '1,3p' 2.txt  (‘1,3p’为指定文件一到三行内容)
                     root:x:0:0:root:/root:/bin/bash
                     bin:x:1:1:bin:/bin:/sbin/nologin
                     daemon:x:2:2:daemon:/sbin:/sbin/nologin

                     [root@@321 ~]# sed -n '2p;5p' 2.txt(‘2p;5p’为指定行数为第二行和第五行) 
                     bin:x:1:1:bin:/bin:/sbin/nologin
                     lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 

                正则定位

                      [root@@321 ~]# sed 's/^root/666/g' 2.txt(通过///定位到以root开头的行把root换成666) 
                      666:x:0:0:root:/root:/bin/bash
                  如果没有定位代表定位所有行

二、awk

          主要擅长处理有规律的文本,主要用于做一些格式化处理

           规则:定位+命令

                 定位:

                       行号定位

                        NR==1  行号定位

                        [root@@321 ~]# sed -n '1p' 2.txt 
                        root:x:0:0:root:/root:/bin/bash
                        [root@@321 ~]# awk -F: 'NR==1{print $7}' 2.txt (-F是指定分隔符为‘:’ print 打印,$7是指定的第七小                          /bin/bash                                                                  段)

                        [root@@321 ~]# sed -n '1p;3p' 2.txt 
                        root:x:0:0:root:/root:/bin/bash
                        daemon:x:2:2:daemon:/sbin:/sbin/nologin
                        [root@@321 ~]# awk -F: 'NR==1 || NR==3{print $2,$7}' 2.txt (|| 是或者用来连接两个行号定位,分别取
                        x /bin/bash                                                                                   第一行和第三行第2和第7小段
                        x /sbin/nologin

                        [root@@321 ~]# sed -n '3,5p' 2.txt 
                        daemon:x:2:2:daemon:/sbin:/sbin/nologin
                        adm:x:3:4:adm:/var/adm:/sbin/nologin
                        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                        [root@@321 ~]# awk -F: 'NR>=3 && NR<=5{print $3,$7}' 2.txt (&&表示并且,取行范围是三到
                        2 /sbin/nologin                                                                                 行并且取这三行内第三和第七小段
                        3 /sbin/nologin                                                                                 的内容)
                        4 /sbin/nologin
                         [root@@321 ~]# awk -F"/" 'NR==5{print $(NF-1)}' 2.txt  (NF是符号分割后行的长度)
                         sbin

                       正则定位
                         [root@@321 ~]# sed -n '1p' 2.txt 
                         root:x:0:0:root:/root:/bin/bash
                         [root@@321 ~]# awk -F: '$1 ~ /root/{print $0}' 2.txt ($1在这个位置代表第一段有root就把整行打印下
                         root:x:0:0:root:/root:/bin/bash                                         来)
                  

三、grep

   擅长过滤

   命令

   grep 选项 “过滤规则” 文件

          [root@@321 A]# touch {1..8}.txt(创建了1-8这八个文件夹)
          [root@@321 A]# ls
          1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt
          [root@@321 A]# vimdiff -O 1.txt 7.txt-O左右分屏,在1.txt和7.txt两个文件里编辑了“root”并保存) 
          还有 2 个文件等待编辑
          [root@@321 A]# grep -rn "root"(用grep过虑带有root的文件其中 -r 是递归着扫描当前文件夹及其下的所有子文
          1.txt:1:root                                     文夹 -n 是显示行号)-r通常不会单独使用(-i 是忽略大小写  -l 如果文件中但凡

          7.txt:1:root                                     是存在 "root" 行就算过滤成功,会返回文件名)

 
        [root@@321 /]# ps aux  查看进程池
        [root@@321 /]# ps aux | grep "[s]sh"( | 管道符号,把前面的命令结果丢到管道内,后面的命令再从管道内取
        root       6810  0.0  0.4 112756  4308 ?        Ss   08:24   0:00 /usr/sbin/sshd -D          出然后执行。grep过滤出ssh
        root       8117  0.0  0.6 161364  6068 ?        Ss   13:19   0:01 sshd: root@pts/1          相关的进程)
        root       8833  0.0  0.6 161364  6064 ?        Ss   15:44   0:00 sshd: root@pts/0
        [root@@321 /]# kill -9 8117    (直接杀掉当前号码的进程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                

 

<think>嗯,用户想了解Linux下的文本处理三剑客awk、sed和grep的使用方法。我需要先回忆这三个工具的基本功能和常见用例。首先,grep主要用于搜索文本,sed用于流编辑,而awk则更擅长处理结构化文本和生成报告。 用户可能已经知道这三个工具的大致用途,但需要具体的教程和示例。我应该从每个工具的基本语法开始,然后给出常见的使用场景和例子。比如,grep可以用来查找包含特定模式的行,sed可以替换文本,awk可以处理列数据。 还要注意用户提到的引用内容,引用1中提到了三者的区别,引用23是关于awk的具体例子。需要确保回答中包含这些引用中的信息,但不要直接复制,而是自然地融入进去。例如,在讲awk的时候,可以提到BEGIN块的使用,如引用3中的例子。 用户可能需要的是实用、简明的教程,所以每个部分都应该分点说明,比如基本语法、常用参数、典型应用场景,并附上示例代码。同时,生成相关问题时,要考虑用户可能的进一步需求,比如性能优化、复杂用法或组合使用这三个工具的技巧。 还需要检查是否遵循了系统级指令,比如数学公式的格式是否正确,中文回答,结构清晰。另外,确保引用的标识正确添加,比如在提到grep适合查找文本时,加上引用[^1]。 可能用户在实际使用中会遇到的问题,比如如何组合这三个命令,或者如何处理大型日志文件,这些可以作为相关问题提出。同时,要确保回答中的命令示例正确,比如awk脚本的编写和执行,如引用2中的例子。 最后,总结部分要简明扼要,强调三者的结合使用能提高效率,并引导用户参考手册深入学习。检查是否有遗漏的重要知识点,比如正则表达式在三个工具中的应用,或者sed的多行处理能力等。</think>### Linux文本处理三剑客使用教程 #### 一、grep:文本搜索工具 **核心功能**:通过正则表达式在文件中搜索指定模式,返回匹配行[^1]。 1. **基本语法**: ```bash grep [选项] 模式 文件名 ``` 2. **常用参数**: - `-i`:忽略大小写 - `-v`:反向匹配(显示不包含模式的行) - `-r`:递归搜索目录 - `-n`:显示行号 3. **典型应用**: ```bash # 查找包含"error"的日志行(带行号) grep -n "error" /var/log/syslog # 统计包含"GET"请求的nginx日志数量 grep -c "GET" access.log # 递归搜索目录中所有Python文件的TODO标记 grep -r --include="*.py" "TODO" ~/projects/ ``` #### 二、sed:流编辑器 **核心功能**:通过脚本指令对文本进行非交互式编辑[^1]。 1. **基本语法**: ```bash sed [选项] &#39;脚本命令&#39; 文件名 ``` 2. **常用操作**: ```bash # 替换文本(全局替换) sed &#39;s/old/new/g&#39; file.txt # 删除空白行 sed &#39;/^$/d&#39; file.txt # 仅处理第5-10行并替换 sed &#39;5,10s/foo/bar/&#39; file.txt ``` 3. **高级应用**: ```bash # 原地编辑文件(-i参数) sed -i.bak &#39;s/原字符串/新字符串/&#39; config.conf # 多命令组合(-e参数) sed -e &#39;s/foo/bar/&#39; -e &#39;/^#/d&#39; script.py ``` #### 三、awk:文本分析工具 **核心功能**:基于字段处理结构化文本,支持编程逻辑[^1][^2]。 1. **基本结构**: ```bash awk &#39;BEGIN{预处理} 模式{动作} END{后处理}&#39; 文件名 ``` 2. **字段处理**: ```bash # 显示/etc/passwd第1和第3列(以冒号分隔) awk -F: &#39;{print $1, $3}&#39; /etc/passwd # 统计文件行数 awk &#39;END{print NR}&#39; data.txt ``` 3. **条件判断**: ```bash # 筛选第三列大于1000的用户(如引用[2]示例) awk -F: &#39;$3 >= 1000 {print $1}&#39; /etc/passwd # 计算CSV文件第二列总和 awk -F, &#39;{sum+=$2} END{print sum}&#39; data.csv ``` 4. **脚本文件**: ```awk #!/bin/awk -f BEGIN {FS=":"; print "用户分析报告"} $3 >= 1000 {print "普通用户:", $1} END {print "----结束----"} ``` #### 四、组合应用案例 ```bash # 分析nginx日志:统计不同状态码出现次数 awk &#39;{print $9}&#39; access.log | sort | uniq -c | grep -E &#39;200|404|500&#39; # 批量修改配置文件:注释掉所有包含"debug"的行 sed -i &#39;/debug/s/^/#/&#39; *.conf # 提取特定时间段的日志(2023-10-01 14:00-15:00) grep "2023-10-01 1[4-5]:" app.log | awk &#39;/14:30:00/,/15:00:00/&#39; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值