第六章:文本处理工具
文本查看命令(cat)
分页查看文件(more)
文本查看上下翻页(less)
显示头部(head)
显示尾部(tail)
按列抽取文本cut
合并文件paste
收集文本统计数据wc
文本排序sort
删除重复uniq
比较文件diff
复制对文件改变patch
文本搜索工具grep
egrep 及扩展的正则表达式
作业:
命令简介:
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–(XX%)
可以用下列不同的方法对提示做出回答:
less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而
more
命令只能向前浏览。用less
命令显示文件时,用PageUp
键向上翻页,用PageDown
键向下翻页。要退出less程序,应按Q
键。
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命令默认在屏幕上显示指定文件的末尾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经常用来显示文件的内容,类似于下的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
(选项)(参数)
选项 -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指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。计数单词总数、行总数、字节总数和字符总数
使用 -l 来只计数行数
使用 -w 来只计数单词总数
使用 -c 来只计数字节总数
使用 -m 来只计数字符总数
$ wc story.txt
39 237 1901 story.txt
实例:
[root@localhost ~]# wc anaconda-ks.cfg
81 212 2633 anaconda-ks.cfg
[root@localhost ~]# wc anaconda-ks.cfg -l
81 anaconda-ks.cfg
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
语法
sort(选项)(参数)
选项
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
参数
文件:指定待排序的文件列表。
实例:
[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u |wc -l
5
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命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
比较两个文件之间的区别
[root@localhost ~]# diff anaconda-ks.cfg aa.txt
5c5
< install
—
> instaii
注明第5 行有区别(改变)
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(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 -E
, egrep
元字符分类:字符匹配
、匹配次数
、位置锚定
、分组
基本正则表达式元字符
字符匹配:
. 匹配任意单个字符;
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
* 匹配零个或多个字符 # 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 = grep -E
egrep [OPTIONS] PATTERN [FILE…]
扩展正则表达式的元字符:
字符匹配:
. 任意单个字符
[] 指定范围的字符
[^] 不在指定范围的字符
次数匹配:
* :匹配前面字符任意次
?: 0 或1次 次
+ :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}\>
本文出自 “家住海边喜欢浪” 博客,请务必保留此出处http://zhang789.blog.51cto.com/11045979/1836379
原文地址:http://zhang789.blog.51cto.com/11045979/1836379