文本处理三剑客

本文介绍了文本处理三剑客grep、sed、awk。着重讲解了sed的选项、命令及用法总结,如增删改查操作;还阐述了awk,它不仅是系统命令,也是编程语言,介绍了其常用参数、相关概念,并通过多个例子展示了结合内置变量、正则、比较符号等的使用方法。

文本处理三剑客

grep sed awk

sed是可以不打开文件进行增删改查,vim的缺点是打开文件会把文件加载到我们的内存中,占用我们的内存,sed不会把文件加载到内存当中。

要先观察格式

格式

sed 选项 sed命令 文件名

sed选项

不输出模式空间里的内容

-n 

执行多条sed命令

-e 

使用拓展正则时用

-r 

直接修改文件内容

-i 

sed命令

追加在指定行的下面

a 

如何追加多行

sed '2i ok\nok1\nok3' 文件名

取代指定行

c 

删除,可以支持多行,比如1,3就是第一行和第三行

d 

删除所有行

sed 'd' 文件名

插入在指定行的上面

i 

输出指定内容

p 

一般结合-n使用

sed '/root/p' –n /etc/passwd

取反,放在命令前面

sed用法总结

1.查找指定的字符串

例子:显示/etc/passwd中保含root的行(显示模式空间中的内容)

方法1

sed '/root/p' /etc/passwd

方法2

cat /etc/passwd | sed '/root/p'

2.在指定的位置做增删

例子:删除以root为开头的行

sed '/^root/d' a.txt

例子:在包含root的行后添加一行 i am ken

sed '/root/a i am ken' a.txt

3.按行替换

例子:将5到9行的内容替换为 i am ken

sed '5,9c i am ken' a.txt

4.按照字符替换

例子:将/etc/selinux/config中的SELINUX=enforcing改成 disabled

写法1

sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' config

写法2

sed -r -i 's/(SELINUX=)disabled/\1enforcing/g' config

5.查找指定的内容再做替换

例子:将以r开头的行中的oo替换为qq

sed '/^r/{s/oo/qq/g}' passwd

6.多点编辑

例子:去除文件中的注释行和空白行

grep -v -E "(^#)|(^$)" passwd.bak >passwd

cat passwd.bak | sed -e '/^#/d' -e '/^$/d' >passwd

7.取反操作

显示非1-3行

sed -n '1,3!p' passwd

awk不仅是系统命令,也是编程语言

格式

awk awk参数 ‘匹配的是什么东西{对这个东西做什么}’ file

常用参数只有一个 –F 指定分隔符

几个小概念

记录(record):一行就是一个记录

分隔符(field separator):进行对记录进行切割的时候所使用的字符

字段(field):将一条记录分割成的每一段

FILENAME:当前处理文件的文件名

FS(Field Separator):字段分隔符(默认是以空格为分隔符=)

NR(Number of Rrecord):记录的编号(awk每读取一行,NR就加1==)

NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段==)

1. 结合内置变量,打印指定的几行,以及字段数量

例子;输出有多余5个字段的行的第三个字段

cat a.sh | awk -F ":" 'NF>=5{print $3}'

例子:输出每行行号和该行有几个字段

cat a.sh | awk -F ":" '{print NR,NF}'

例子:输出用户名,要求所有用户显示在同一行,而且用空格分隔

cat mypwd | awk 'BEGIN{FS=":"; ORS=" "}{print $1}'

2. 结合正则来匹配一行或者某个字段

例子:输出用户名以s为开头的用户的uid

cat mypwd | awk -F ":" '/^s/{print $}'

例子:输出第五个字段是以t为结尾的用户的姓名

cat mypwd | awk -F ":" '$5~/t$/{print $1}'

3. 采用比较符号来进行打印指定的某些行

例子:实现仅仅输出3-5的内容,每行前面添加一个行号

cat mypwd | awk 'NR>=3&&NR<=5{print NR,$1}'

cat mypwd | awk 'NR==3,NR==5{print NR,$1}'

例子:实现仅仅输出3 和 5 和 7行的内容,每行前面添加一个行号

cat mypwd | awk 'NR==3||NR==5||NR==7{print NR,$1}'

4. END

例子:统计mypwd中以#开头的行有多少行

cat mypwd | awk 'BEGIN{n=0}/^#/{n+=1}END{print n}'

统计:mypwd中,以:为分隔符,字段数量在3-5的行的数目

cat mypwd  | awk 'BEGIN{FS=":"}NF>=3&&NF<=5{n+=1}END{print n}'

5. ip

例子:统计IP

[root@ken]# cat url.txt | awk -F "/+" '{urls[$2]++}END{for(key in urls)print key, urls[key]}’

www.baidu.com 12

haha.baidu.com 1

ftp.baidu.com 6

mail.baidu.com 7

转载于:https://www.cnblogs.com/shuaiyin/p/10917158.html

<think>嗯,用户想了解Linux下的文本处理三剑客awk、sed和grep的使用方法。我需要先回忆这三个工具的基本功能和常见用例。首先,grep主要用于搜索文本,sed用于流编辑,而awk则更擅长处理结构化文本和生成报告。 用户可能已经知道这三个工具的大致用途,但需要具体的教程和示例。我应该从每个工具的基本语法开始,然后给出常见的使用场景和例子。比如,grep可以用来查找包含特定模式的行,sed可以替换文本,awk可以处理列数据。 还要注意用户提到的引用内容,引用1中提到了三者的区别,引用2和3是关于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 [选项] '脚本命令' 文件名 ``` 2. **常用操作**: ```bash # 替换文本(全局替换) sed 's/old/new/g' file.txt # 删除空白行 sed '/^$/d' file.txt # 仅处理第5-10行并替换 sed '5,10s/foo/bar/' file.txt ``` 3. **高级应用**: ```bash # 原地编辑文件(-i参数) sed -i.bak 's/原字符串/新字符串/' config.conf # 多命令组合(-e参数) sed -e 's/foo/bar/' -e '/^#/d' script.py ``` #### 三、awk:文本分析工具 **核心功能**:基于字段处理结构化文本,支持编程逻辑[^1][^2]。 1. **基本结构**: ```bash awk 'BEGIN{预处理} 模式{动作} END{后处理}' 文件名 ``` 2. **字段处理**: ```bash # 显示/etc/passwd第1和第3列(以冒号分隔) awk -F: '{print $1, $3}' /etc/passwd # 统计文件行数 awk 'END{print NR}' data.txt ``` 3. **条件判断**: ```bash # 筛选第三列大于1000的用户(如引用[2]示例) awk -F: '$3 >= 1000 {print $1}' /etc/passwd # 计算CSV文件第二列总和 awk -F, '{sum+=$2} END{print sum}' data.csv ``` 4. **脚本文件**: ```awk #!/bin/awk -f BEGIN {FS=":"; print "用户分析报告"} $3 >= 1000 {print "普通用户:", $1} END {print "----结束----"} ``` #### 四、组合应用案例 ```bash # 分析nginx日志:统计不同状态码出现次数 awk '{print $9}' access.log | sort | uniq -c | grep -E '200|404|500' # 批量修改配置文件:注释掉所有包含"debug"的行 sed -i '/debug/s/^/#/' *.conf # 提取特定时间段的日志(2023-10-01 14:00-15:00) grep "2023-10-01 1[4-5]:" app.log | awk '/14:30:00/,/15:00:00/' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值