5个常用文本处理命令
1.head
2.tail
3.grep
4.sed
5.awk
1. head
语法: head -n *** file
顾名思义,中文意思就是头部的意思, 它的用法就是按顺序查看或过滤文本的
比如我用cat -n chunxiao.txt命令查看文件的内容是这样的, -n是什么意思呢, n就是number的缩写, number,数字
[root@centos7 chunxiao]# cat -n chunxiao.txt 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
这里面有9行内容, 如果我只想看前面的5行, 后面的不要显示它, 这个时候就是用下面的命令
cat -n chunxiao.txt | head -n 5
eg.
[root@centos7 chunxiao]# cat -n chunxiao.txt | head -n 5 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf
详细说明,这里用到了管道符 | ,管道符的作用就是交接, 就是用cat -n chunxiao.txt查看出来文件的全部内容, 然后用管道符把这个全部的内容传输给了后面的head去处理过滤。其实还有一条命令更加简洁:head -n 5 chunxiao.txt
实现的效果是一样的, 请看下面
[root@centos7 chunxiao]# head -n 5 chunxiao.txt total 32 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf
看, 也是把前面5行的内容拿出来了, 只不过没显示行号而已, 要显示行号呢, 可以先用cat 再用head 就像上面用管道符那样。
2.tail
语法1: tail -n ** file
语法2: tail -f file
tail,尾部的意思, 就是倒数去读取,它应该怎么去实现呢,现在我们已经知道chunxiao.txt这个文件下面的所有的内容了, 是长这个样子的, 是吧小白
[root@centos7 chunxiao]# cat -n chunxiao.txt 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
那么, 我想就取文件的第8和第9行(换句话说就是取倒数开始的两行)
那么命令就是
cat -n chunxiao.txt | tail -n 2
查询出来的结果就是这样的
[root@centos7 chunxiao]# cat -n chunxiao.txt | tail -n 2 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
呐, 用tail -n 2 chunxiao.txt也是可以达到同样效果的哈
还有一个比较常用的是-f参数, 这个到时候我们再说。
下面就到文本的三剑客了
文本三剑客(grep,sed,awk)
3.grep
语法: grep "****" file
这个你已经认识的了,在查询进程或者是查询端口的时候, 不知道你是否还记得,傻孩子
它的作用很简单, 常用的就是过滤与反过滤,下面我再用chunxiao.txt这个文件演示
现在我们很清楚chunxiao.txt下面的内容是什么了
[root@centos7 chunxiao]# cat -n chunxiao.txt 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
如果,我只想要显示关于"system"这个字眼的
cat -n chunxiao.txt | grep "system"
eg.
[root@centos7 chunxiao]# cat -n chunxiao.txt | grep "system" 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf
它就会单独给我们列出两行出来
如果, 我想让他不显示关于"system"字眼的
cat -n chunxiao.txt | grep -v "system"
eg.
[root@centos7 chunxiao]# cat -n chunxiao.txt | grep -v "system" 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
它就排除了有关"system"字眼的行
4.sed
语法1: sed 's/原来的/更新后/g' file
语法2: sed -i 's///' file
(就是把"原来的"替换成了"更新后", g代表所有, 所有都替换, 如果只需要替换第一行, 那就把g去掉, 就是 sed 's/***/***/')
sed, sed最大的能力在于替换, 就是把1替换成2,类似于update(更新)吧
还是以chunxiao.txt这个文件来说, 让你加强记忆
[root@centos7 chunxiao]# cat -n chunxiao.txt 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
文件的内容已经看了很多遍了,你看第二行最后的那个名字是叫"bootchart.conf", 现在我要把它变成zhenghua.conf
cat -n chunxiao.txt | sed 's/bootchart.conf/zhenghua.conf/g'
eg.
[root@centos7 chunxiao]# cat -n chunxiao.txt | sed 's/bootchart.conf/zhenghua.conf/g' 1 total 32 2 -rw-r--r-- 1 root root 720 Jul 31 16:15 zhenghua.conf 3 -rw-r--r-- 1 root root 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 root root 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 root root 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 root root 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 root root 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 root root 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 root root 1127 Jul 31 16:15 user.conf
你看, 是不是变化了
再来一个增强记忆, 你看第4和第5列, 是不是都是显示"root", 那么我们把它显示为xiaobai
cat -n chunxiao.txt | sed 's/root/xiaobai/g'
eg.
[root@centos7 chunxiao]# cat -n chunxiao.txt | sed 's/root/xiaobai/g' 1 total 32 2 -rw-r--r-- 1 xiaobai xiaobai 720 Jul 31 16:15 bootchart.conf 3 -rw-r--r-- 1 xiaobai xiaobai 615 Jul 31 16:15 coredump.conf 4 -rw-r--r-- 1 xiaobai xiaobai 983 Jul 31 16:15 journald.conf 5 -rw-r--r-- 1 xiaobai xiaobai 957 Jul 31 16:15 logind.conf 6 drwxr-xr-x. 12 xiaobai xiaobai 4096 Jul 31 16:15 system 7 -rw-r--r-- 1 xiaobai xiaobai 1551 Mar 12 2019 system.conf 8 drwxr-xr-x. 2 xiaobai xiaobai 4096 Jul 31 16:15 user 9 -rw-r--r-- 1 xiaobai xiaobai 1127 Jul 31 16:15 user.conf
已经发生了变化
5.awk
语法1:awk '{print$n}' n:数字
语法2:awk -F '*' '{print$n}' n:数字, -F'*' 分隔符
awk, 按列筛选, 这个我比较常用
还是以chunxiao.txt这个文件来说哈
请看, 现在里面有9列, 是吧
那么我只想把第8列显示出来
cat chunxiao.txt | awk '{print$8}'
eg.
[root@centos7 chunxiao]# cat chunxiao.txt | awk '{print$8}' 16:15 16:15 16:15 16:15 16:15 2019 16:15 16:15
呐, 是这个样子的
如果我想看第9列呢
[root@centos7 chunxiao]# cat chunxiao.txt | awk '{print$9}' bootchart.conf coredump.conf journald.conf logind.conf system system.conf user user.conf
如果我只想看最后一列呢
[root@centos7 chunxiao]# cat chunxiao.txt | awk '{print$NF}' 32 bootchart.conf coredump.conf journald.conf logind.conf system system.conf user user.conf
如果我想把第8和第9列都显示呢
[root@centos7 chunxiao]# cat chunxiao.txt | awk '{print$8,$9}' 16:15 bootchart.conf 16:15 coredump.conf 16:15 journald.conf 16:15 logind.conf 16:15 system 2019 system.conf 16:15 user 16:15 user.conf
好了, 完毕, 那5个语法一定要记下来, 写进你的记事本。