linux 下的shell 文本处理工具

        grep、sed和awk都是文本处理工具,虽然都是文本处理工具单却都有各自的优缺点,一种文本处理命令是不能被另一个完全替换的,否则也不会出现三个文本处理命令了。只不过,相比较而言,sed和awk功能更强大而已,且已独立成一种语言来介绍。

一、grep 与egrep

grep:文本过滤器,如果仅仅是过滤文本,可使用grep,其效率要比其他的高很多。

1. grep 的常用命令

-i 忽略字母大小写
-v 条件取反
-c 统计匹配行数
-q 静默,无任何输出
-n 显示匹配结果所在的行号

忽略大小写:

反向过滤:过滤掉没有‘l’ 的行

统计匹配行数:

2. 正则表达式

扫描二维码关注公众号,回复: 4674733 查看本文章

        由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符的字面意思,而表示控制或通配的功能。

^:匹配开头

匹配以大写字母‘A’ 开头的行

匹配多个条件时,要用egrep

匹配以字母‘a’ 开头或者‘d’ 开头的行

此时,不能有空格,否则会对所需匹配的内容再加上空格进行匹配

匹配文件中是否包含关键字,其中 && 代表前一条命令执行成功所要执行的内容,|| 代表前一条命令执行失败所要执行的内容

加上 -q 静默输出,只显示结果

egrep -m10 :只对前10行内容进行匹配

$:匹配结尾

.:匹配任意字符

过滤非空行

截取空行:

方法一:反向截取任意字符的行,截取没有字符的行

方法二:截取以空为开头,以空为结尾的行

截取以某一内容至少出现一次的行

截取某一内容或者某一内容后再加某内容的行

截取,某一内容连续出现几次的行

截取a 出现2到4次的行

截取a 出现3次以上的行

截取a, 和 aA 的行

截取大写字母A 到Z 的行

3. cut 命令

截取以冒号为分隔符,1到3列的内容

截取1和4列的字符

练习三:利用文本处理方式,显示ip 地址

以空格为分隔符,显示第10列的信息即为ip 地址

练习四:编写脚本,测试能否与某一ip 地址进行通信,若能显示up ,否则显示down

ping -c 为几次后停止, -w 为间隔几毫秒

其中,/dev/null  : 在类Unix系统中,/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。
在程序员行话,尤其是Unix行话中,/dev/null 被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用于输入流的空文件。当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。

4. sort 命令

-n 纯数字排序
-r 倒序排序
-u 去掉重复数字
-o 输出到指定文件中
-t 指定分隔符
-k

指定要排序的列

显示cpu 使用率最高的5个进程的id 号和其cpu 使用率

按每一列的字符进行排序

按数字到小排序

去掉重复数字,并按数字大小进行排序

指定分隔符为: ,并对第3列的数字大小进行排序

对排序结果进行保存

5. uniq 命令

该命令可对重复字符进行处理

-u 显示唯一的行
-d 显示重复的行
-c

每行显示一次并统计重复次数

先排序,再去除重复的行

先排序,再显示重复的行

练习五:将目录内最大的文件其名称显示出来

6. test 命令

test “$a” == "$b" 等同于 [ "$a" == "$b" ]    ##判断等于

[ "$a" != "$b" ]    ##判断不等于

对整数进行判断也可以用如下方式:

[ "$a" -eq "$b" ]    ##判断等于

[ "$a" -ne "$b" ]    ##判断不等于

[ "$a" -le "$b" ]    ##判断小于等于

[ "$a" -ge "$b" ]    ##判断大于等于

[ "$a" -gt "$b" ]    ##判断大于

[ "$a" -lt "$b" ]    ##判断小于

[ "$a" -ne "$b" -a “$a” -gt "$b" ]    ##两个条件需同时满足

[ "$a" -ne "$b" -o “$a” -gt "$b" ]    ##两个条件至少满足一个

判断一个变量是否为空:[ -z "$a" ]

对文件类型进行判断:

[ -e "file" ]    ##是否存在

[ -f "file" ]    ##普通文件

[ -b "file" ]    ##块设备

[ -S "file" ]    ##套接字

[ -c "file" ]    ##字符设备

[ -L "file" ]    ##软链接

练习六:编写脚本文件,判断输入的数字是否为空,同时是否小于等于10,且大于1

练习七:编写脚本,输入文件名,并判断文件类型

7. exit 命令

exit  0:正常运行程序并退出程序;

exit  1:非正常运行导致退出程序;

exit 0 可以告知你的程序的使用者:你的程序是正常结束的。如果 exit 非 0 值,那么你的程序的使用者通常会认为你的程序产生了一个错误。

二、sed

sed:Stream EDitor,流编辑器,默认只处理模式空间,不处理原数据,如果你处理的数据是针对行进行处理的,可以使用sed。一次处理一行内容,处理时,把当前的行存储在临时缓冲区,处理完后,输送到屏幕。

1. sed 命令参数

sed  [参数]  ' 命令 ' file

命令:

p    ##显示

d    ##删除

a    ##添加

c    ##替换

i    ##插入

参数:

-n    ##静默输出

2. 显示(p)

显示有:的行

显示以# 开头的行

显示不以# 开头的行

显示2到6行

显示第2和第6行

3. 删除(d)

删除以UUID 为开头的行

删除空行

删除1到4行

4. 添加(a)

在有hello 的那行后添加一行westos

5. 替换相应内容(s)

把内容替换为其他内容

把hello 替换为hello 换行 world

6. 替换整行(c)

用sss 替换有world 的那一行

7. 插入(i)

在有hello 的那一行前面,插入world 换行 westos

8. 保存相应修改(-i)

保存修改至原文件

练习八:编写脚本,将http 服务的端口号改为相应的值

端口号已被更改

三、awk

awk:报告生成器,格式化以后显示。如果对处理的数据需要生成报告之类的信息,或者你处理的数据是按列进行处理的,最好使用awk。根据模式一次从文件中抽取一行文本,对这行文本进行切片(默认使用空白字符作为分隔符)。

1. 输出相应的列

默认以空格为分隔符,输出第1列

输出整行

输出第一列与第二列,并以空格隔开

2. 指定分隔符(-F)

3. 输出文件名,行号和列号(FILENAME,NR,NF)

输出文件名与行号

输出行号与列号

4. 文本处理前后所执行的语句

开始前:BEGIN { }:读入第一行文本之前执行的语句,一般用来初始化操作

结束后:END { }

对以bash 为结尾的行进行输出

输出第3行

输出偶数行

以:为分隔符,输出第三列大于等于0且小于2的行的第1和第3列

列出uid 小于2的用户信息

统计文本总字段数

统计以:为分隔符,第7列是以bash 结尾的行数

分别统计uid 号小于等于500 的个数和大于500 的个数

awk 的循环语句

猜你喜欢

转载自blog.csdn.net/weixin_43369306/article/details/85270778