我相信大家在使用Linux过程中总会遇到想要提取某些自己需要的信息的情况,比如如下这四种情况:
1、找出ifconfig命令结果中eno16777728的IPv4地址
2、查出分区空间使用率的最大百分比值
3、查出/tmp的权限,以数字方式显示
这个时候,我们使用命令当然也可以查看,不过还需要自己通过眼睛去过滤不需要的信息,多费劲。如何让自己更轻松的看到自己想看到自己想看的信息呢?今天的文本处理命令能满足我们的简单需求。
wc 此wc非彼WC,在这里wc是word count的简写
wc - print newline, word, and byte counts for each file
其表达格式:wc [OPTION]... [FILE]...
常用选项:
-l:lines 只显示行数
-w:words 只显示单词总数
-c:bytes 只显示该内容字节总数
下面以实例来具体显示wc的功用
创建/test目录 创建/test/wc.txt文件
1
2
3
<code>[root@localhost </code><code>test</code><code>]</code><code># cat > 1</code>
<code>hello me</code>
<code>hello my boy</code>
使用cat在wc.txt内输入一些字符
4
5
6
7
8
<code>[root@localhost </code><code>test</code><code>]</code><code># wc wc.txt </code>
<code> </code><code>2 5 22 </code><code>wc</code><code>.txt 第一个2代表行数 第二个5代表单词数 第三个22代表该内容字节总数 </code>
<code>[root@localhost </code><code>test</code><code>]</code><code># wc -l wc.txt </code>
<code>2 </code><code>wc</code><code>.txt</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># wc -c wc.txt </code>
<code>22 </code><code>wc</code><code>.txt</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># wc -w wc.txt </code>
<code>5 </code><code>wc</code><code>.txt</code>
cut
cut - remove sections from each line of files
表达格式:cut OPTION... [FILE]...
-d<char> : 以指定的字符为分隔符
-f #(单个字段)|#-#(连续多个字段)|#,...,#(离散多个字段)
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
以/etc/passwd文件为对象做实验
1、取用户名及用户UID并指定输出的分隔符为#
<code>[root@localhost </code><code>test</code><code>]</code><code># tail -5 /etc/passwd</code>
<code>laowang:x:4322:4322::</code><code>/home/laowang</code><code>:</code><code>/bin/bash</code>
<code>u1:x:4323:4323:UUU:</code><code>/home/u1</code><code>:</code><code>/bin/csh</code>
<code>u2:x:4324:4324::</code><code>/home/u2</code><code>:</code><code>/bin/bash</code>
<code>u3:x:4325:4325::</code><code>/home/u3</code><code>:</code><code>/bin/bash</code>
<code>u4:x:4326:4326::</code><code>/home/u4</code><code>:</code><code>/sbin/nologin</code>
通过上面内容,我们可以确定我们需要的内容在第一节跟第三节,同事分隔符为“:”
<code>[root@localhost </code><code>test</code><code>]</code><code># cut -d: -f 1,3 /etc/passwd --output-delimiter=#</code>
<code>root</code><code>#0</code>
<code>bin</code><code>#1</code>
<code>daemon</code><code>#2</code>
<code>adm</code><code>#3</code>
<code>..</code>
2、查看/etc/passwd文件最后一行,且从第5个字符开始截取到第十个字符.
<code>[root@localhost </code><code>test</code><code>]</code><code># tail -1 /etc/passwd | cut -c 5-10</code>
<code>:4326:</code>
sort 排序
sort - sort lines of text files
表达格式: sort [OPTION]... [FILE]...
-t CHAR:指定分隔符
-k #:用于排序比较的字段
-n:基于数值大小排序
-r:逆序排列
-f:忽略字符大小写
-u:重复内容只保留一行
还是以/etc/passwd为对象测试
显示UID最大的用户及其默认shell
9
<code>root@localhost </code><code>test</code><code>]</code><code># sort -t: -k 3 -n /etc/passwd </code>
<code>root:x:0:0:root:</code><code>/root</code><code>:</code><code>/bin/bash</code>
<code>bin:x:1:1:bin:</code><code>/bin</code><code>:</code><code>/sbin/nologin</code>
<code>daemon:x:2:2:daemon:</code><code>/sbin</code><code>:</code><code>/sbin/nologin</code>
<code>adm:x:3:4:adm:</code><code>/var/adm</code><code>:</code><code>/sbin/nologin</code>
<code>...</code>
<code>basher:x:4329:4329::</code><code>/home/basher</code><code>:</code><code>/bin/bash</code>
<code>nologin:x:4330:4330::</code><code>/home/nologin</code><code>:</code><code>/sbin/nologin</code>
<code>nfsnobody:x:65534:65534:Anonymous NFS User:</code><code>/var/lib/nfs</code><code>:</code><code>/sbin/nologin</code>
显示成功,但是结果并不直观,我们在利用上面的cut命令对结果进行进一步加工
<code>[root@localhost </code><code>test</code><code>]</code><code># sort -t: -k 3 -n /etc/passwd | tail -1 | cut -d: -f 1,7</code>
<code>nfsnobody:</code><code>/sbin/nologin</code>
uniq 报告或移除重复的行
uniq - report or omit repeated lines
表达格式:uniq [OPTION]... [INPUT [OUTPUT]]
-c:显示每行的重复次数
-u:仅显示未曾重复过的行
-d:仅显示重复过的行
为了演示uniq命令方便,我们创建一个有重复行的文件/test/uniq.txt
10
11
12
13
14
15
16
17
<code>[root@localhost </code><code>test</code><code>]</code><code># cat uniq.txt </code>
<code>qqqq</code>
<code>dfsdf</code>
<code>aa</code>
<code>bb</code>
<code>cc</code>
<code>q</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># uniq uniq.txt </code>
uniq 加文件默认将重复的内容隐藏。
<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -c uniq.txt </code>
<code> </code><code>3 qqqq</code>
<code> </code><code>1 dfsdf</code>
<code> </code><code>1 aa</code>
<code> </code><code>2 bb</code>
<code> </code><code>1 cc</code>
<code> </code><code>1 q</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -u uniq.txt </code>
<code>[root@localhost </code><code>test</code><code>]</code><code># uniq -d uniq.txt </code>
diff 逐行比较文件的异同
diff - compare files line by line
diff [OPTION]... FILES
-u:使用unified机制,即显示要修改的行的上下文,默认3行
18
19
20
21
22
23
24
25
<code>[root@localhost </code><code>test</code><code>]</code><code># cat diff1 diff2</code>
<code>abcd</code>
<code>abcde</code>
<code>bcd</code>
<code>bc</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># diff diff1 diff2 </code>
<code>1c1</code>
<code>< abcd</code>
<code>---</code>
<code>> bcd</code>
<code>3c3</code>
<code>> </code><code>bc</code>
<code>[root@localhost </code><code>test</code><code>]</code><code># diff -u diff1 diff2</code>
<code>--- diff1 2016-08-05 19:46:36.985538120 +0800</code>
<code>+++ diff2 2016-08-05 19:46:54.951836769 +0800</code>
<code>@@ -1,3 +1,3 @@</code>
<code>-abcd</code>
<code>+bcd</code>
<code> </code><code>abcde</code>
<code>+</code><code>bc</code>
patch 向文件打补丁
基本概念 patch - apply changes to files
表达格式patch [-blNR][ -c| -e| -n][-d dir][-D define][-i patchfile]
[-o outfile][-p num][-r rejectfile][file]
patch [OPTION] -l /PATH/PATH_FILE /PATH/OLDFILE
patch /PATH/OLDFILE < /PATH/PATH_FILE
常用的简单文本处理命令介绍完毕,下面来利用本文介绍的命令来解决开头提出的四个问题
<code>ifconfig</code> <code>| </code><code>tr</code> <code>-cs </code><code>'[:digit:].'</code> <code>':'</code><code>| </code><code>cut</code> <code>-d: -f 5</code>
<code>10.1.253.79</code>
以上共分3步
1)先将ifconfig的内容当做tr的基本输入内容;2)将第一步的内容中所有非数字的内容替换为":"并压缩;3)看所需的IP在第几段然后使用cut命令进行切割
查看分区空间命令为df
<code>[root@localhost </code><code>test</code><code>]</code><code># df | tr -s ' ' ':'| cut -d: -f 5| tr -d '%'|sort -n|tail -1</code>
<code>29</code>
要实现上述内容需要
1)使用df列出分区空间使用率的内容,
2)之后使用tr将空格替换为:并进行压缩,
3)再之后使用cut进行切割将使用率的列取出,
4)再使用tr将%剔除,
5)之后使用sort按数值大小进行排序
6)最后再使用tail取最后一行的最大值。
查看/tmp权限可以使用stat,它可以自动显示处其权限对应的数值,剩下的只需要我们将数字从内容中取出即可。
<code>root@localhost </code><code>test</code><code>]</code><code># stat /tmp/ | tr -cs '[:digit:]' ':'| cut -d: -f 9</code>
<code>1777</code>
1)先显示权限内容
2)将内容中所有非数字替换为“:”并压缩
3)数出对应的权限数字在第几段后进行切割
本文转自 紫色的茶碗 51CTO博客,原文链接:http://blog.51cto.com/chawan/1834875,如需转载请自行联系原作者