第六章:文本处理工具

  • 第六章:文本处理工具

    • 文本查看命令(cat)

    • 分页查看文件(more)

    • 文本查看上下翻页(less)

    • 显示头部(head)

    • 显示尾部(tail)

    • 按列抽取文本cut

    • 合并文件paste

    • 收集文本统计数据wc

    • 文本排序sort

    • 删除重复uniq

    • 比较文件diff

    • 复制对文件改变patch

    • 文本搜索工具grep

    • egrep 及扩展的正则表达式

    • 作业:

第六章:文本处理工具

文本查看命令(cat)

命令简介:

cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。 注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态

参数:
-n或-number:有1开始对所有输出的行数编号;
-b或–number-nonblank:和-n相似,只不过对于空白行不编号;
-s或–squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;
-A:显示不可打印字符,行尾显示“$”;
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;
-E:  显示行结束符$

演示:

[root@localhost ~]# cat 3.txt 
1
[root@localhost ~]# cat -n 3.txt (-n 选项显示行数编号)
1    1
[root@localhost ~]# cat > 4.txt <<end(把输入内容追加到文本里面去)
> 22
> 33
> 44
> end
[root@localhost ~]# cat 4.txt (查看文本信息)
22
33
44
[root@localhost ~]# tac 4.txt (反过来显示文本信息)
44
33
22

分页查看文件(more)

该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:–More–(XX%)可以用下列不同的方法对提示做出回答:

文本查看上下翻页(less)

less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。

显示头部(head)

head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。

[root@localhost ~]# head -3 /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

显示尾部(tail)

tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入。

[root@localhost ~]# tail -3 /etc/passwd
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
mageedu:x:1000:1000:mageedu:/home/mageedu:/bin/bash

实例: 
有新信息就触发显示屏幕

[root@localhost ~]# tail -n 0 -f /var/log/messages &

按列抽取文本cut

cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容,类似于下的type命令

-b:仅显示行中指定直接范围的内容; 
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;

实例: 
显示文件第一例信息

[root@localhost ~]# cat test.txt 
No Name Mark Percent
01 om 69 91
02 jack 71 87
03 alex 68 98
[root@localhost ~]# cut -d" " -f1 test.txt
No
01
02
03

显示文件前三位和第三位后面的信息

[root@localhost ~]# cat test2.txt
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
[root@localhost ~]# cut -c1-3 test2.txt
abc
abc
abc
abc
abc
[root@localhost ~]# cut -c3- test2.txt
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz
cdefghijklmnopqrstuvwxyz

合并文件paste

paste 合并两个文件同行号的列到一行 
paste命令用于将多个文件按照列队列进行合并。 
语法 
paste(选项)(参数) 
选项 
-d<间隔字符>或–delimiters=<间隔字符>:用指定的间隔字符取代跳格字符; 
-s——serial串列进行而非平行处理。所有行合成一行显示 
实例:

[root@localhost ~]# echo "1" > 3.txt
[root@localhost ~]# echo "2" > 4.txt
[root@localhost ~]# paste 3.txt 4.txt
1   2
[root@localhost ~]# paste 3.txt 4.txt  -d :
1:2
[root@localhost ~]# paste 3.txt 4.txt  -d +
1+2
[root@localhost ~]# paste 3.txt 4.txt  -d + |bc
3

收集文本统计数据wc

wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。计数单词总数、行总数、字节总数和字符总数

使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -c 来只计数字节总数
使用 -m 来只计数字符总数
$ wc story.txt
39 237 1901 story.txt
行数 字数 字符数
39 237 1901

实例:

[root@localhost ~]# wc anaconda-ks.cfg  
 81  212 2633 anaconda-ks.cfg
[root@localhost ~]# wc anaconda-ks.cfg  -l
81 anaconda-ks.cfg

文本排序sort

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。

语法 
sort(选项)(参数)

选项

-b:忽略每行前面开始出的空格字符; 
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

参数 
文件:指定待排序的文件列表。 
实例:

[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u |wc -l
5

删除重复uniq

uniq 命令:从输入中删除重复的前后相接的行

参数:

-c:  显示每行重复出现 的 次数
-d:  仅显示重复过 的 行
-u:  仅显示不曾重复 的 行

常和sort 命令一起配合使用:

[root@localhost ~]# sort userlist.txt | uniq -c
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort | uniq -c | sort -u
     1 /bin/sync
     1 /sbin/halt
     1 /sbin/shutdown
     2 /bin/bash
    33 /sbin/nologin

比较文件diff

diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。

比较两个文件之间的区别

[root@localhost ~]# diff anaconda-ks.cfg aa.txt 
5c5
< install

> instaii
注明第5 行有区别(改变)

复制对文件改变patch

diff 命令的输出被保存在一种叫做“补丁”的文件中

使用 -u 选项来输出“统一的(unified )”diff 格式文件,最适用于补丁文件。 
patch 命令复制在其它文件中进行的改变(要谨慎使用!) 
-i<修补文件>或–input=<修补文件>:读取指定的修补问家你; 
-b或–backup:备份每一个原始文件; 
-u或–unified:把修补数据解译成一致化的差异;

适用 -b 选项来自动备份改变了的文件

$ diff -u foo.conf-broken foo.conf-works > foo.patch
$ patch -b foo.conf-broken foo.patch

文本搜索工具grep

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

参数:

–color=auto:  对匹配到的文本着色显示;
-v:  显示不能够被pattern 匹配到的行;
-i:  忽略字符大小写
-n: : 显示匹配的行号
-c:  统计匹配的行数
-o:  仅显示匹配到的字符串;
-q:  静默模式,不输出任何信息
-A #: after,  后#行 行
-B #: before,  前#行 行
-C # :context,  前后各#行 行
-e :实现多个选项间的逻辑or 关系
grep –e ‘cat ’ -e ‘dog’ file
-w :整行匹配整个单词
-E :使用ERE

基本正则表达式:BRE 
扩展正则表达式:ERE 
grep -Eegrep 
元字符分类:字符匹配匹配次数位置锚定分组

基本正则表达式元字符 
字符匹配:

.       匹配任意单个字符;
[]      匹配指定范围内的任意单个字符
[^]     匹配指定范围外的任意单个字符
*       匹配零个或多个字符   # ls *
?       匹配任何单个字符    # ls a?
~          当前用户家目录
~username  用户家目录
~+     当前工作目录  # ls ~+
~-     前一个工作目录 # ls ~-
[0-9]   匹配一个数字范围
[a-z]   大写和小写字母
[A-Z]   大写字母
[wxc]   匹配列表中的任何的一个字符
[^wxc]  匹配列表中的所有字符以外的字符

预定义的字符类: :#man 7 glob

    [:digit:] :任意数字,相当于0-9
   [:lower:] :任意小写字母
   [:upper:]:  任意大写字母
   [:alpha:]:  任意大小写字母
   [:alnum:] :任意数字或字母
   [:space:] :空格
   [:punct:] :标点符号

正则表达式 
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

*                     匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配
.*                    任意长度的任意字符
\? :                 匹配其前面的字符0 或1次 次
\+ :              匹配其前面的字符至少1次 次
\{n\} :         匹配前面 的 字符n次 次
\{m,n\} :     匹配前面的字符至少m 次,至多n次 次
\{,n\} :        匹配前面的字符至多n次 次
\{n,\} :        匹配前面的 字符 至少n

位置锚定:定位出现的位置

^ :行首锚定,用于模式的最左侧
$ :行尾锚定,用于模式的最右侧
^PATTERN$:  用于模式匹配整行
^$:  空行
^[[:space:]]*$  :空白行
\< 或 或 \b :词首锚定,用于单词模式的左侧
\> 或 或 \b :词尾锚定;用于单词模式的右侧
\<PATTERN\>

egrep 及扩展的正则表达式

egrep = grep -E 
egrep [OPTIONS] PATTERN [FILE…] 
扩展正则表达式的元字符: 
字符匹配:

.  任意单个字符
[]  指定范围的字符
[^]  不在指定范围的字符

次数匹配:

* :匹配前面字符任意次
?: 01次 次
+ :1 次或多次
{m} :匹配m次 次
{m,n} :至少m ,至多n次

位置锚定:

^ : 行首
$ : 行尾
\<, \b : 语首
\>, \b : 语尾

分组:

()
后向引用:\1, \2, ...
或者:
a|b
C|cat: C 或cat
(C|c)at:Cat 或cat

作业:

显示/etc/passwd文件中不以/bin/bash结尾的行:

grep -v “/bin/bash$” /etc/passwd

找出/etc/passwd文件中的两位数或三位数

grep "\<[0-9]\{2,3\}\>" /etc/passwd

找出/etc/rc.syslnit或者/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行

grep “^[[:space:]]\+[^[:space:]]” /etc/passwd

找到 “netstat -tan” 命令的结果中以“LISTEN”后跟0,1或多个空白字符结尾的行

netstat -tan | grep “LISTEN[[:space:]]*$”

分组实验:

He loves his loves
He likes his loves
She likes her liker
She lover her liker
grep "\(l..e).*\1" lover.txt

找出/proc/meminfo文件中,所有以大写或小写S开头的行,三种方式

grep -i “^s” /porc/meminfo
grep "^[sS]" /porc/meminfo
grep -E "^(s|S)" /porc/meminfo

显示系统上 root,cnetos或者user1用户的相关信息;

grep -E “^(root|centos|user1)\>” /etc/passwd

找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions

使用echo命令输出一绝对路径,使用egrep取出基名

echo /etc/sysconfig/ | gerp -E -o "[^/]+/?$"

添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin),然后找出/etc/passwd/文件中用户名同shell名的行

grep -E “^([^:]).*\1$” /etc/passwd

取本机ip地址

[root@localhost ~]# ifconfig | grep -E -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"  | grep -E -v "255|127.0.0.1"
192.168.119.131

取各分区利用率的数值

[root@localhost ~]# df | grep -E "^/dev/sd*" | grep -E -o "[[:digit:]]*[$%]"
1%
13%
29%
[root@localhost ~]# df | grep "^/dev/sb*" | tr -s " " ":" |cut -d: -f1,5
/dev/sda2:1%
/dev/sda3:13%
/dev/sda1:29%

统计/etc/init.d/functions 文件中每个单词出现的次数,并按频率从高到低显示

cat /etc/init.d/functions | tr -cs '[:alpha:]' "\n" | sort |uniq -c|  sort -n -r

/etc/rc.d/init.d/functions或/etc/rc.d/init.d/functions/” 取目录名

[root@localhost ~]# echo "/etc/rc.d/init.d/functions/" | egrep -o "/.*[^/]" | egrep -o "/.*/"
/etc/rc.d/init.d/

正则表达式表示身份证号

echo "ID CARD :41272519940000301x" | egrep -o "\<[1-9][0-9]{5}(19[0-9][0-9]|200[0-9]|201[0-6])(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])[0-9]{3}([0-9]|x)\>"

正则表达式表示手机号

echo "Phone number : 18321401988" | egrep -o "\<1(3|5|7|8)[0-9]{9}\>"

正则表达式表示邮箱

echo "is who : zhang132485@163.com" |grep -o "\<[[:alnum:]]\+@[[:alnum:]]\+\.com"

正则表达式表示QQ号

echo "fajfahghjfas 939488549" | egrep -o "\<[1-9][0-9]{4,9}\>

作者:马哥教育面授20班

         M20_he

原创文章,作者:M20_he,如若转载,请注明出处:http://www.178linux.com/31317