shell编程前奏,Linux文本处理工具汇总grep、cut、sort、tee、diff、paste、tr
目录
一、grep 行过滤
二、cut 列截取
三、sort 排序
四、uniq 去重
五、tee 读取标准输入
六、diff 比较文件差异
七、paste 合并
八、tr 字符转换
8.1 替换
8.2 删除
8.3 压缩
九、总结
本篇汇总了Linux中的文本处理工具,也是shell脚本编程中经常要用到的工具,有些工具例如grep绝对是要重点掌握的,而有些工具例如paste个人觉得很鸡肋
一、grep 行过滤
grep是行过滤工具,根据关键字进行行过滤,这个命令可以结合正则表达式使用
常见选项:
OPTIONS: -i: 不区分大小写 -v: 查找不包含指定内容的行,反向选择 -w: 按单词搜索 -o: 打印匹配关键字 -c: 统计匹配到的行数 -n: 显示行号 -r: 逐层遍历目录查找 -A: 显示匹配行及后面多少行 -B: 显示匹配行及前面多少行 -C: 显示匹配行前后多少行 -l:只列出匹配的文件名 -L:列出不匹配的文件名 -e: 使用正则匹配 -E:使用扩展正则匹配 ^key:以关键字开头 key$:以关键字结尾 ^$:匹配空行 --color=auto :可以将找到的关键词部分加上颜色的显示
二、cut 列截取
cut命令有两个主要的功能,第一是显示文件内容,第二是连接多个文件
若不指定file参数,该命令将读取标准输入。 必须指定 -b、-c 或 -f 标志之一
常用参数:
-b | 以字节为单位进行分割 ,仅显示行中指定直接范围的内容 |
-c | 以字符为单位进行分割 , 仅显示行中指定范围的字符 |
-d | 自定义分隔符,默认为制表符”TAB” |
-f | 显示指定字段的内容 , 与-d一起使用 |
-n | 取消分割多字节字符 |
#截取用户名passwd文件中的用户名[root@localhost data]# cut -d: -f1 passwd rootbindaemonadmlpsync#仅显示部分#显示passwd前十个字符[root@localhost data]# cut -c1-10 passwd root:x:0:0bin:x:1:1:daemon:x:2adm:x:3:4:lp:x:4:7:lsync:x:5:0shutdown:xhalt:x:7:0mail:x:8:1operator:x#仅显示部分#截取passwd文件第十个到最后的字符[root@localhost data]# cut -c10- passwd 0:root:/root:/bin/bash:bin:/bin:/sbin/nologin2:2:daemon:/sbin:/sbin/nologin:adm:/var/adm:/sbin/nologinlp:/var/spool/lpd:/sbin/nologin0:sync:/sbin:/bin/syncx:6:0:shutdown:/sbin:/sbin/shutdown0:halt:/sbin:/sbin/halt#仅显示部分
#列出当前系统的运行级别***********************如何查看系统运行级别命令:runlevel文件:/etc/inittab***********************[root@localhost data]# runlevel N 5[root@localhost data]# runlevel |cut -c35[root@localhost data]# runlevel |cut -d ' ' -f25
三、sort 排序
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出
sort命令既可以从特定的文件,也可以从stdin中获取输入
sort命令将文件的每一行作为一个单位,从首字符向后,依次按ASCll码值进行比较,最后升序输出
常用参数:
-u :去除重复行-r :降序排列,默认是升序-o : 将排序结果输出到文件中,类似重定向符号>-n :以数字排序,默认是按字符排序-t :分隔符-k :第N列-b :忽略前导空格。-R :随机排序,每次运行的结果均不同
#将passwd文件的前十行导出,安装第三列数字的升序排序[root@localhost data]# head passwd > 1.txt[root@localhost data]# cat -n 1.txt 1root:x:0:0:root:/root:/bin/bash 2bin:x:1:1:bin:/bin:/sbin/nologin 3daemon:x:2:2:daemon:/sbin:/sbin/nologin 4adm:x:3:4:adm:/var/adm:/sbin/nologin 5lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6sync:x:5:0:sync:/sbin:/bin/sync 7shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 8halt:x:7:0:halt:/sbin:/sbin/halt 9mail:x:8:12:mail:/var/spool/mail:/sbin/nologin 10operator:x:11:0:operator:/root:/sbin/nologin[root@localhost data]# sort -n -t: -k3 1.txtroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[root@localhost data]#
四、uniq 去重
该命令的作用是用来去除文本文件中连续的重复行,中间不能夹杂其他文本行。去除了重复的,保留的都是唯一的
sort只要有重复行,它就去除,而uniq重复行必须要连续,也可以用它忽略文件中的重复行
常用参数:
-i | 忽略大小写 |
-c | 打印每行在文本中重复出现的次数 |
-d | 只显示有重复的纪录,每个重复纪录只出现一次 |
-u | 只显示没有重复的纪录 |
[root@localhost data]# cat 3.txt test 30 test 30 test 30 Hello 95 Hello 95 Hello 95 Hello 95 Linux 85 Linux 85#查看时删除文件中连续重复的行[root@localhost data]# uniq 3.txt test 30 Hello 95 Linux 85#打印重复的次数[root@localhost data]# uniq -c 3.txt3 test 30 4 Hello 95 2 Linux 85#只显示没有重复的记录[root@localhost data]# uniq -u 3.txt [root@localhost data]#
五、tee 读取标准输入
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
双向覆盖重定向
常用参数:
-a | 附加到既有文件的后面,而非覆盖它 |
-i | 忽略中断信号 |
#导出文件中的非注释信息,并且去掉空行,导入bak文件中[root@localhost data]# grep -v '^#' vsftpd.conf |grep -v '^$' |tee bakanonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=NOlisten_ipv6=YESpam_service_name=vsftpduserlist_enable=YEStcp_wrappers=YES[root@localhost data]# cat bak anonymous_enable=YESlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect_from_port_20=YESxferlog_std_format=YESlisten=NOlisten_ipv6=YESpam_service_name=vsftpduserlist_enable=YEStcp_wrappers=YES[root@localhost data]#
六、diff 比较文件差异
diff以逐行的方式,比较文本文件的异同处
如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录
选项 | 含义 |
---|---|
-b | 不检查空格 |
-B | 不检查空白行 |
-i | 不检查大小写 |
-w | 忽略所有的空格 |
--normal | 正常格式显示(默认) |
-c | 上下文格式显示 |
-u | 合并格式显示 |
#文件准备[root@localhost data]# cat -n file1 1aaaa 2111 3hello world 4222 5333 6bbb[root@localhost data]# cat -n file2 1aa 2hello 3111 4222 5bbb 6333 7world[root@localhost data]# #diff目的:显示file1如何改变才能和file2匹配[root@localhost data]# diff file1 file21c1,2第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到2行匹配< aaaa小于号" aaa大于号">"表示右边文件(file2)文件内容> hello3d3第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配< hello world5d4第一个文件的第5行删除后才能和第二个文件的第4行匹配 333需要增加的内容在第二个文件里是333和world> world
七、paste 合并
paste命令会把每个文件以列对列的方式,一列列地加以合并 ,他就是相当于把两个不同的文件内容粘贴在一起,形成新的文件。
注意:paste默认粘贴方式以列的方式粘贴,但是并不是不能以行的方式粘贴,加上-s选项就可以行方式粘贴。
常用参数:
-d | 自定义间隔符,默认是tab键 |
-s | 将每个文件粘贴成一行 |
-- | 从标准输入中读取数据 |
#准备文件[root@localhost data]# cat file1hello wordstevelu[root@localhost data]# cat file2CSDN88889999yyds#合并查看,以冒号分隔[root@localhost data]# paste -d: file1 file2hello word:CSDNstevelu:8888:9999yyds[root@localhost data]# #横向显示,默认tab键隔开[root@localhost data]# paste -s file1 file2hello wordsteveluCSDN88889999yyds
paste和cat都不改变原文件,也不生成新文件,个人感觉合并查看用cat就行,paste有点鸡肋
八、tr 字符转换
将字符进行替换、压缩、删除,他可以将一组字符转换成另一组字符。tr他只能从标准输入中读取数据,因此,tr要么将输入文件重定向到标准输入,要么从管道读入数据
注意:tr类似于sed命令,但是比sed简单,所以tr能实现的功能,sed都能实现
语法:
- 用法1:命令的执行结果交给tr处理,其中string1用于查询,string2用于转换处理
commands|tr 'string1' 'string2'
- 用法2:tr处理的内容来自文件,记住要使用"<"标准输入
tr 'string1' 'string2' < filename
- 用法3:匹配string1进行相应操作,如删除操作
tr [options] 'string1' < filename
常用参数:
-c | 选定字符串1中字符集的补集,即反选字符串1的补集 |
-d | 删除字符串1中出现的所有字符 |
-s | 删除所有重复出现的字符序列,只保留一个 |
字符串 | 含义 |
---|---|
a-z或[:lower:] | 匹配所有小写字母 |
A-Z或[:upper:] | 匹配所有大写字母 |
0-9或[:digit:] | 匹配所有数字 |
[:alnum:] | 匹配所有字母和数字 |
[:alpha:] | 匹配所有字母 |
[:blank:] | 所有水平空白 |
[:punct:] | 匹配所有标点符号 |
[:space:] | 所有水平或垂直的空格 |
所有大小写和数字[a-zA-Z0-9]
8.1 替换
注:tr只能一对一替换,不能将一堆替换为一个
8.2 删除
8.3 压缩
九、总结
这里列举的所有工具都不修改原文件
我们在写shell脚本的时候会经常用到这些文本工具,要熟悉一下