文本基本处理工具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本基本处理工具相关的知识,希望对你有一定的参考价值。
cat
tac (反向列示)
rev (reverse)
more
less
head
tail
hexdump
cut
paste
join
wc
sort
uniq
diff
patch
tr
(一).整个文本输出
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。
1.命令格式:
cat [选项] [文件]...
2.命令功能:
cat主要有三大功能:
1.一次显示整个文件:cat filename
2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件:cat file1 file2 > file (先重定向file1内容、在追加file2内容到file中)
3.命令参数:
-A, --show-all 显示所有 包括空字符、换行符等
-b, --number-nonblank 对非空输出行编号
-e 等价于 -vE
-E, --show-ends 在每行结束处显示 $
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行
示例:
cat -A f1 显示所有 包括空字符、换行符等
cat -n f1 f2 f1后紧接f2内容,并编号
说明:
tac 是将 cat 反写过来,所以他的功能就跟 cat 相反, cat 是由第一行到最后一行连续显示在萤幕上,而 tac 则是由最后一行到第一行反向在萤幕上显示出来!
这个命令和cat也是反的, 不过它不像tac那样, 它输出行的顺序和cat也是一样的, 不过输出每行的时候, 先输出最后一个字符, 接着是倒数第二个字符, 最后才是第一个字符, 下面这个命令可以把输入全部倒过来:
[[email protected] ~]# cat re
one apple a day!
two apple two day!
[[email protected] ~]# rev re
!yad a elppa eno
!yad owt elppa owt
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。
1.命令格式:
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]
2.命令功能:
more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。
3.命令参数:
+n 从笫n行开始显示
-n 定义屏幕大小为n行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示
-c 从顶部清屏,然后显示
-d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l 忽略Ctrl+l(换页)字符
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s 把连续的多个空行显示为一行
-u 把文件内容中的下画线去掉
4.常用操作命令:
Enter 向下n行,需要定义。默认为1行
Ctrl+F 向下滚动一屏
空格键 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
V 调用vi编辑器
!命令 调用Shell,并执行命令
q 退出more
5.命令实例:
实例1:显示文件中从第3行起的内容
命令:
more +3 log2012.log
输出:
[[email protected] test]# cat log2012.log
2012-01
2012-02
2012-03
2012-04-day1
======
[[email protected] test]# more +3 log2012.log
2012-03
2012-04-day1
======
实例2:从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出
命令:
more +/day3 log2012.log
输出:
[[email protected] test]# more +/day3 log2012.log
...skipping
2012-04-day1
2012-04-day2
2012-04-day3
2012-05
实例3:设定每屏显示行数
命令:
more -n 3 log2012.log
输出:
[[email protected] test]# more -n 3 log2012.log
2012-01
2012-02
2012-03
说明:
如下图所示,最下面显示了该屏展示的内容占文件总行数的比例,按 Ctrl+F 或者 空格键 将会显示下一屏5条内容,百分比也会跟着变化。
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
1.命令格式:
less [参数] 文件
2.命令功能:
less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
3.命令参数:
-b <缓冲区大小> 设置缓冲区的大小
-e 当文件显示结束后,自动离开
-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
-S 行过长时间将超出部分舍弃
-x <数字> 将“tab”键显示为规定的数字空格
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b 向后翻一页
d 向后翻半页
h 显示帮助界面
Q 退出less 命令
u 向前滚动半页
y 向前滚动一行
空格键 滚动一行
回车键 滚动一页
[pagedown]: 向下翻动一页
[pageup]: 向上翻动一页
注:less可同时查看多个文件使用n或者p进行切换
(二).部分输出
1.命令格式:
head [参数]... [文件]...
2.命令功能:
head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
3.命令参数:
-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数
4.使用实例:
实例1:显示文件的前n行
命令:
head -n 3 log2014.log
输出:
[[email protected] test]# cat log2014.log
2014-01
2014-02
2014-03
2014-04
==============================
[[email protected] test]# head -n 5 log2014.log
2014-01
2014-02
2014-03
实例2:显示文件前n个字节
命令:
head -c 20 log2014.log
输出:
[[email protected] test]# head -c 20 log2014.log
2014-01
2014-02
2014
实例3:文件的除了最后n个字节以外的内容
命令:
head -c -32 log2014.log
输出:
[[email protected] test]# head -c -32 log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
2014-07
2014-08
2014-09
2014-10
2014-11
2014-12
实例4:输出文件除了最后n行的全部内容
命令:
head -n -6 log2014.log
输出:
[[email protected] test]# head -n -6 log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
2014-07
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,
tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.常用于查看日志
1.命令格式:
tail[必要参数][选择参数][文件]
2.命令功能:
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
3.命令参数:
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束.
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
4.使用实例:
实例1:显示文件末尾内容
命令:
tail -n 3 log2014.log 显示文件最后3行内容
输出:
[[email protected] test]# tail -n 5 log2014.log
2014-09
2014-10
2014-11
==============================
实例2:循环查看文件内容,常用于跟踪日志
watch -n 1 f1.log 一秒刷新日志
tail -f f1.log 实时跟踪日志
命令:
tail -f test.log
输出:
[[email protected] ~]# ping 192.168.120.204 > test.log &
[1] 11891[[email protected] ~]# tail -f test.log 或者watch -n 1 test.log
PING 192.168.120.204 (192.168.120.204) 56(84) bytes of data.
64 bytes from 192.168.120.204: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 192.168.120.204: icmp_seq=2 ttl=64 time=0.036 ms
说明:
ping 192.168.120.204 > test.log & //在后台ping远程主机。并输出文件到test.log;这种做法也使用于一个以上的档案监视。用Ctrl+c来终止。
实例3:从第5行开始显示文件
命令:
tail -n +5 log2014.log
输出:
[[email protected] test]# cat log2014.log
2014-01
2014-02
2014-03
2014-04
2014-05
2014-06
==============================
[[email protected] test]# tail -n +5 log2014.log
2014-05
2014-06
==============================
hexdump用来查看二进制文件。
1.命令格式:
hexdump [options] file...
2.命令参数:
-b 单字节八进制显示,十六进制显示偏移量,每行显示16个字符,每字符用三位显示,不足补零,列间以空格分隔
-c 单字节字符显示,十六进制显示偏移量,每行显示16个字符,每字符三位显示,不足补空格,列间以空格分隔
-C 标准十六进制+ascii码显示,十六进制显示偏移量,每行16个字符,每字符两位显示,不足补0,结尾显示当前16位数据的ascii码值,以|框住
-e format_string 以指定的格式显示
-n length 只显示length个字节的数据
-s offset 跳过从开始的offset个字节,默认输入十进制,以0x或0X开始按16进制处理,否则如以0开始按八进制处理,如果以b/k/m结尾,则原数值乘以512/1024/1048576
-v 显示所有数据,如果不包含这一选项,对于同上一行完全相同的数据,hexdump会以*代替显示
-x 两位十六进制显示.十六进制显示偏移量,每行8组数据,每数据占两字节,4列,不足补零,以空格分隔
3.实例:
[[email protected] ~]# hexdump -n10 -v -C -s 10 /bin/cat
0000000a 00 00 00 00 00 00 02 00 3e 00 |........>.|
(三)按列抽取与合并
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。
1、命令格式:
cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]
2.使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
3主要参数:
b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用: 1-3,7
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。
4.cut定位方法:
cut命令主要是接受三个定位方法:
第一,字节(bytes),用选项-b
第二,字符(characters),用选项-c
第三,域(fields),用选项-f,与-d结合使用
实例一:以字节定位
[[email protected] ~]# ll re
-rw-r--r-- 1 root root 57 Jan 3 22:36 re
[[email protected] ~]# cat re
two apple two day!
tree
four
five
six
[[email protected] ~]# cut -b 1,2,5-7 re
twapp
tr
fo
fi
si
实例二:以字符定位
[[email protected] ~]# ll re
-rw-r--r-- 1 root root 57 Jan 3 22:36 re
[[email protected] ~]# cat re
one apple a day!
two apple two day!
tree
four
five
six
[[email protected] ~]# cut -c 1,3,6-8 re
oeppl
toppl
te
fu
fv
实例三:以域定位
[[email protected] ~]# head -n3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]# head -n3 /etc/passwd | cut -d: -f 1,3,5-7
root:0:root:/root:/bin/bash
bin:1:bin:/bin:/sbin/nologin
daemon:2:daemon:/sbin:/sbin/nologin
paste单词意思是粘贴。该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
1.命令格式:
paste [OPTION]... [FILE]...
2、常用选项:
-d: 指定两个文件的行合并后的分割符
-s: 将每个文件合并为一行,而不是按行进行合并
3、常见用法:
paste file1 file2 #将两个文件的每行合并
paste -d: file1 file2 #将两个文件的每行合并,分隔符为:
paste -s file1 file2 #将file1的内容合并为一行,将file2的内容合并为一行
实例:
[[email protected] ~]# cat a
aa
bb
cc
dd
ee
[[email protected] ~]# cat b
xx
hh
cc
zz
ll
[[email protected] ~]# paste a b
aa xx
hh
bb cc
cc zz
dd ll
ee
[[email protected] ~]# paste -d: a b #使用冒号作为分隔符
aa:xx
:hh
bb:cc
cc:zz
dd:ll
ee:
[[email protected] ~]# paste -s a b #a文件合并一行,b文件合并一行
aa bb cc dd ee
xx hh cc zz ll
join将两个文件中,指定栏位内容相同的行连接起来。
1.命令格式:
join [-i][-a<1或2>][-e<字符串>][-o<格式>] [-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2]
2.命令参数:
-a<1或2> 除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
-i或--igore-case 比较栏位内容时,忽略大小写的差异。
-o<格式> 按照指定的格式来显示结果。
-t<字符> 使用栏位的分隔字符。
-1<栏位> 连接[文件1]指定的栏位。
-2<栏位> 连接[文件2]指定的栏位。
3.命令说明:
默认连接是每个文件的第一个字段。
指定输出字段: -o <FILENO.FIELDNO> ... 其中FILENO=1表示第一个文件,FILENO=2表示第二个文件,FIELDNO表示字段序号,从1开始编号。默认会全部输出,但关键字列只输出一次。 比如:-o 1.1 1.2 2.2 表示输出第一个文件的第一个字段、第二个字段,第二个文件的第二个字段。
使用示例
示例一 内连接(忽略不匹配的行)不指定任何参数的情况下使用join命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。
[[email protected] linux]# cat month_cn.txt
1 一月
2 二月
3 三月
4 四月
5 五月
6 六月
7 七月
8 八月
9 九月
10 十月
11 十一月
12 十二月
13 十三月,故意的
[[email protected] linux]# cat month_en.txt
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
14 MonthUnknown
注:注意两个文件的内容,中文版的多了十三月,英文版的多了14月,这纯粹是为了方便演示。
[[email protected] linux]# join month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
[[email protected] linux]#
示例二 左连接(又称左外连接,显示左边所有记录)显示左边文件中的所有记录,右边文件中没有匹配的显示空白。
[[email protected] linux]# join -a1 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月
[[email protected] linux]#
示例三 右连接(又称右外连接,显示右边所有记录)显示右边文件中的所有记录,左边文件中没有匹配的显示空白。
[[email protected] linux]# join -a2 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
14 MonthUnknown
[[email protected] linux]#
**示例四 全连接(又称全外连接,显示左边和右边所有记录)**
[[email protected] linux]# join -a1 -a2 month_cn.txt month_en.txt
1 一月 January
2 二月 February
3 三月 March
4 四月 April
5 五月 May
6 六月 June
7 七月 July
8 八月 August
9 九月 September
10 十月 October
11 十一月 November
12 十二月 December
13 十三月
14 MonthUnknown
[[email protected] linux]#
示例五 指定输出字段'比如参数 -o 1.1 表示只输出第一个文件的第一个字段。
[[email protected] linux]# join -o 1.1 month_cn.txt month_en.txt
1
2
3
4
5
6
7
8
9
10
11
12
[[email protected] linux]# join -o 1.1 2.2 month_cn.txt month_en.txt
1 January
2 February
3 March
4 April
5 May
6 June
7 July
8 August
9 September
10 October
11 November
12 December
[[email protected] linux]# join -o 1.1 2.2 1.2 month_cn.txt month_en.txt
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[[email protected] linux]# join -o 1.1 2.2 1.2 1.3 month_cn.txt month_en.txt <== 字段1.3并不存在
1 January 一月
2 February 二月
3 March 三月
4 April 四月
5 May 五月
6 June 六月
7 July 七月
8 August 八月
9 September 九月
10 October 十月
11 November 十一月
12 December 十二月
[[email protected] linux]#
示例六:我们知道 /etc/passwd 第四个字段是 GID那个 GID 记录在 /etc/group 当中的第三个字段,请问如何将两个文件整合?
[[email protected] ~]# head -n 3 /etc/passwd /etc/group
==> /etc/passwd <==
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
==> /etc/group <==
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
# 从上面可以看到,确实有相同的部分喔!赶紧来整合一下!
[[email protected] ~]# join -t ':' -1 4 /etc/passwd -2 3 /etc/group
0:root:x:0:root:/root:/bin/bash:root:x:root
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x:root,bin,daemon
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x:root,bin,daemon
# 同样的,相同的字段部分被移动到最前面了!所以第二个文件的内容就没再显示。
五、文本分析
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
1.命令格式:
wc [选项]文件...
2.命令功能:
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
3.命令参数:
-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息
4.使用实例:
实例1:查看文件的字节数、字数、行数
命令:
wc test.txt
输出:
[[email protected] test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu linux
Redhat
linuxmint
[[email protected] test]# wc test.txt
7 8 70 test.txt
[[email protected] test]# wc -l test.txt
7 test.txt
[[email protected] test]# wc -c test.txt
70 test.txt
[[email protected] test]# wc -w test.txt
8 test.txt
[[email protected] test]# wc -m test.txt
70 test.txt
[[email protected] test]# wc -L test.txt
17 test.txt
说明:
7 8 70 test.txt
行数 单词数 字节数 文件名
实例2:用wc命令怎么做到只打印统计数字不打印文件名
[[email protected] test]# wc -l test.txt
7 test.txt
[[email protected] test]# cat test.txt |wc -l 或者 wc -l < test.txt
7
说明:
使用管道线,这在编写shell脚本时特别有用。
实例3:用来统计当前目录下的文件数
命令:
ls -l | wc -l
输出:
[[email protected] test]# cd test6
[[email protected] test6]# ll
总计 604
---xr--r-- 1 root mail 302108 11-30 08:39 linklog.log
---xr--r-- 1 mail users 302108 11-30 08:39 log2012.log
-rw-r--r-- 1 mail users 61 11-30 08:39 log2013.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2014.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2015.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2016.log
-rw-r--r-- 1 root mail 0 11-30 08:39 log2017.log
[[email protected] test6]# ls -l | wc -l
8
[[email protected] test6]#
说明:
数量中包含当前目录
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
1.命令格式:
sort [-fbMnrtuk] [file or stdin]
2.主要参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以字符串来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
实例一:对/etc/passwd 的账号进行排序
[[email protected] ~]# cat /etc/passwd | sort
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序。
实例二:/etc/passwd 内容是以 : 来分隔的,以第三栏来排序
[[email protected] ~]# cat /etc/passwd | sort -t ':' -k 3
root:x:0:0:root:/root:/bin/bash
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
实例三:默认是以字符串来排序的,如果想要使用数字排序:
[[email protected] ~]#cat /etc/passwd | sort -t ':' -k 3n
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
实例四:默认是升序排序,如果要倒序排序
[[email protected] ~]#cat /etc/passwd | sort -t ':' -k 3nr
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
ntp:x:106:113::/home/ntp:/bin/false
messagebus:x:105:109::/var/run/dbus:/bin/false
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
实例五:如果要对/etc/passwd,先以第六个域的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。
[[email protected] ~]#cat /etc/passwd | sort -t':' -k 6.2,6.4 -k 1r
sync:x:4:65534:sync:/bin:/bin/sync
proxy:x:13:13:proxy:/bin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
实例六:查看/etc/passwd有多少个shell:对/etc/passwd的第七个域进行排序,然后去重:
[[email protected] ~]#cat /etc/passwd | sort -t':' -k 7 -u
root:x:0:0:root:/root:/bin/bash
syslog:x:101:102::/home/syslog:/bin/false
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
sshd:x:104:65534::/var/run/sshd:/usr/sbin/nologin
uniq命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。
1.命令格式:
uniq [-idcu]
2.常用参数:
-i:忽略大小写字符的不同;
-c:显示每行重复的次数
-u:只显示唯一的行
-d:仅显示重复过的行
实例:
a.直接删除未经排序的文件,将会发现没有任何行被删除
[[email protected] ~]#cat testfile
hello
world
friend
hello
world
hello
[[email protected] ~]##uniq testfile
hello
world
friend
hello
world
hello
b.排序文件,默认是去重
[[email protected] ~]##cat words | sort |uniq
friend
hello
world
c.排序之后删除了重复行,同时在行首位置输出该行重复的次数
[[email protected] ~]##sort testfile | uniq -c
1 friend
3 hello
2 world
d.仅显示存在重复的行,并在行首显示该行重复的次数
[[email protected] ~]##sort testfile | uniq -dc
3 hello
2 world
e.仅显示不重复的行
[[email protected] ~]#sort testfile | uniq -u
friend
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。
1.命令格式: diff[参数][文件1或目录1][文件2或目录2]
2.命令功能: diff命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。
3.命令参数:
-c 显示全部内文,并标出不同之处。
-u,-U或--unified= 以合并的方式来显示文件内容的不同。
-i:忽略大小写
-b(--ignore-space-change):忽略空格的变化
-B(--ignore-blank-lines):比较时忽略空白行
-a:将比较的文件都当成纯文本文件处理
-r:递归比较子目录(如diff -r /etc/rc.d/rc3.d/ /etc/rc.d/rc5.d/比较两个不同开机运行级别的目录)
-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-w或--ignore-all-space 忽略全部的空格字符。
-W或--width 在使用-y参数时,指定栏宽。
-y或--side-by-side 以并列的方式显示文件的异同之处。
4.diff说明:
正常格式(normal diff)
上下文格式(context diff)
合并格式(unified diff)
a、示例文件
为了便于讲解,先新建两个示例文件。
第一个文件叫做f1,内容是每行一个a,一共7行。
a
a
a
a
a
a
a
第二个文件叫做f2,修改f1而成,第4行变成b,其他不变。
a
a
a
b
a
a
a
b、正常格式的diff
现在对f1和f2进行比较:
$ diff f1 f2
这时,diff就会显示正常格式的结果:
4c4
< a
---
> b
第一行是一个提示,用来说明变动位置。
4c4
它分成三个部分:前面的"4",表示f1的第4行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"(a,代表addition)和"删除"(d,代表deletion);后面的"4",表示变动后变成f2的第4行。
第二行分成两个部分。
< a
前面的小于号,表示要从f1当中去除该行(也就是第4行),后面的"a"表示该行的内容。
第三行用来分割f1和f2。
---
第四行,类似于第二行。
> b
前面的大于号表示f2增加了该行,后面的"b"表示该行的内容。
最早的Unix(即AT&T版本的Unix),使用的就是这种格式的diff。
c、上下文格式的diff
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。
它的使用方法是加入c参数(代表context)。
$ diff -c f1 f2
显示结果如下:
*** f1 2012-08-29 16:45:41.000000000 +0800
--- f2 2012-08-29 16:45:51.000000000 +0800
***************
*** 1,7 ****
a
a
a
!a
a
a
a
--- 1,7 ----
a
a
a
!b
a
a
a
这个结果分成四个部分。
第一部分的两行,显示两个文件的基本情况:文件名和时间信息。
*** f1 2012-08-29 16:45:41.000000000 +0800
--- f2 2012-08-29 16:45:51.000000000 +0800
"***"表示变动前的文件,"---"表示变动后的文件。
第二部分是15个星号,将文件的基本情况与变动内容分割开。
***************
第三部分显示变动前的文件,即f1。
*** 1,7 ****
a
a
a
!a
a
a
a
这时不仅显示发生变化的第4行,还显示第4行的前面三行和后面三行,因此一共显示7行。所以,前面的"*** 1,7 ****"就表示,从第1行开始连续7行。
另外,文件内容的每一行最前面,还有一个标记位。如果为空,表示该行无变化;如果是感叹号(!),表示该行有改动;如果是减号(-),表示该行被删除;如果是加号(+),表示该行为新增。
第四部分显示变动后的文件,即f2。
--- 1,7 ----
a
a
a
!b
a
a
a
除了变动行(第4行)以外,也是上下文各显示三行,总共显示7行。
d、合并格式的diff
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
它的使用方法是加入u参数(代表unified)。
$ diff -u f1 f2
显示结果如下:
--- f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a
它的第一部分,也是文件的基本信息。
--- f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800
"---"表示变动前的文件,"+++"表示变动后的文件。
第二部分,变动的位置用两个@作为起首和结束。
@@ -1,7 +1,7 @@
前面的"-1,7"分成三个部分:减号表示第一个文件(即f1),"1"表示第1行,"7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,"+1,7"表示变动后,成为第二个文件从第1行开始的连续7行。
第三部分是变动的具体内容。
a
a
a
a
-a
+b
a
a
a
除了有变动的那些行以外,也是上下文各显示3行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动(第一个文件、第二个文件共有),减号表示第一个文件删除的行,加号表示第二个文件新增的行。(第一个文件变化到第二文件 增删状况)
实例:diff输出补丁文件,patch给旧文件打补丁
[[email protected] ~]# cat f1
Hi,
Hello,
How are you?
I am fine,
Thank you.
[[email protected] ~]# cat f2
Hello,
Hi,
How are you?
I am fine.
[[email protected] ~]# diff -u f1 f2 > diff.patch #输出不定文件
[[email protected] ~]# patch -b f1 diff.patch #patch给f1打补丁并且备份原来文件
patching file f1
[[email protected] ~]# cat f1
Hello,
Hi,
How are you?
I am fine.
六、文本字符转换
tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
1.命令格式:
tr -c|-d|-s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
2.命令选项:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII.取反
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
-t或--truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
3.命令说明:
指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
\octal 一个三位的八进制数,对应有效的ASCII字符。
[O*n] 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。
实例一:将文件host中出现的"abc"替换为"xyz"
[[email protected] ~]# cat host
:a b c replace e f g replace this is a test page replace
[[email protected] ~]# cat host|tr 'abc' 'xyz'
:x y z replxze e f g replxze this is x test pxge replxze
【注意】这里,凡是在host中出现的"a"字母,都替换成"x"字母,"b"字母替换为"y"字母,"c"字母替换为"z"字母。而不是将字符串"abc"替换为字符串"xyz"。
实例二:使用tr命令“统一”字母大小写
(小写 --> 大写)
[[email protected] ~]# cat host | tr [a-z] [A-Z]
:A B C REPLACE E F G REPLACE THIS IS A TEST PAGE REPLACE
(大写 --> 小写)
[[email protected] ~]# cat host | tr [A-Z] [a-z]
实例二:把f1中0到9转换为a到j
[[email protected] ~]# cat f1
A b c D
e F G H 9 0 8 7 63
h b mfd dgg
[[email protected] ~]# cat f1|tr [0-9] [a-j]
A b c D
e F G H j a i h gd
h b mfd dgg
实例三:删除文件host中出现的"replace"字符
[[email protected] ~]# cat host
:a b c replace e f g replace this is a test page replace
[[email protected] ~]# cat host|tr -d 'replace'
: b f g this is tst g
【注意】这里,凡是在host文件中出现的'r','p','l','a','c','e'字符都会被删除!而不是紧紧删除出现的"replace”字符串。
删除文件file中出现的换行'\n'、制表'\t'字符
[[email protected] ~]# cat file | tr -d "\n\t" > new_file
不可见字符都得用转义字符来表示的,这个都是统一的。
实例四:删除“连续着的”重复字母,只保留第一个
[[email protected] ~]# cat file | tr -s [a-zA-Z] > new_file
实例五:删除空行(连续的换行符删除,删除空行)
[[email protected] ~]# cat file | tr -s "\n" > new_file
实例六:删除Windows文件“造成”的'^M'字符
[[email protected] ~]# cat file | tr -d "\r" > new_file
或者
[[email protected] ~]# cat file | tr -s "\r" "\n" > new_file
【注意】这里-s后面是两个参数"\r"和"\n",用后者替换前者
实例七:用空格符\040替换制表符\011
[[email protected] ~]# cat file | tr -s "\011" "\040" > new_file
实例八:把路径变量中的冒号":",替换成换行符"\n"
[[email protected] ~]# echo $PATH | tr -s ':' '\n'
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/root/bin
实例九:删除f1中除了数字换行之外的所有字符
[[email protected] ~]# cat f1
一月 1
二月 2
三月 3
四月 4
五月 5
六月 6
七月 7
八月 8
九月 9
十月 10
十一月 11
十二月 12
十三月 13
[[email protected] ~]# tr -cd '[0-9]\n' < f1
1
2
3
4
5
6
7
8
9
10
11
12
13
实例十:利用ifconfig去ipv4地址
[[email protected] ~]# ifconfig|tr -cs '[0-9].' '\n'|sort -ut '.' -k3n
127.0.0.1
192.168.1.255
192.168.1.8
255.255.255.0
实例十一:查出/tmp的权限用数字表示
[[email protected] ~]# stat /tmp | tail -4|head -1|tr -s ' ' ':'|cut -d: -f2|tr -dc '[0-9]\n'
1777
实例十二:统计/etc/init.d/functions中每个单词重复的个数
[[email protected] ~]# cat /etc/init.d/functions |tr -sc '[:alpha:]' '\n'|sort|uniq -c|sort -n
实例十四:分区空间使用率的最大百分比值
[[email protected] home]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 50264772 3793656 43911116 8% /
tmpfs 953640 80 953560 1% /dev/shm
/dev/sda3 9948012 22488 9413524 1% /app
/dev/sda1 999320 40128 906764 5% /boot
/dev/sr0 3878870 3878870 0 100% /media/CentOS_6.9_Final
[[email protected] home]# df |tr -s ' ' %|cut -d% -f5 |sort -nr|head -1
100
实例十五:找出ifconfig “网卡名” 命令结果中本机的IPv4地址
[[email protected] home]# ifconfig eth1
eth1 Link encap:Ethernet HWaddr 00:0C:29:87:D3:6C
inet addr:172.18.253.24 Bcast:172.18.255.255 Mask:255.255.0.0
inet6 addr: fe80::20c:29ff:fe87:d36c/64 Scope:Link
[[email protected] home]# ifconfig eth1 |head -2|tail -1|tr -s ' ' ':'|cut -d: -f4
172.18.253.24
实例十六:查出用户UID最大值的用户名、UID及shell类型
[[email protected] home]# cat /etc/passwd |sort -t: -k3 -nr|head -1|cut -d: -f1,3,7
nfsnobody:65534:/sbin/nologin
实例十七:查出/tmp的权限,以数字方式显示
[[email protected] ~]# stat /tmp
File: `/tmp'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 802h/2050d Inode: 2490369 Links: 35
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-24 08:06:10.000000000 +0800
Modify: 2017-07-24 16:14:53.391972308 +0800
Change: 2017-07-24 16:14:53.391972308 +0800
[[email protected] ~]# stat /tmp |head -4|tail -1|tr -s ' '|cut -d' ' -f2|tr '(' '/'|cut -d'/' -f2
1777
[[email protected] ~]# stat /tmp |head -4|tail -1|tr '(' '/'|cut -d'/' -f2
1777
以上是关于文本基本处理工具的主要内容,如果未能解决你的问题,请参考以下文章