文本处理工具
查看文本文件
文件内容:less和cat
文件截取:head和tail
按列抽取:cut
按关键字抽取:grep
文件查看命令:cat, tac,rev
cat [OPTION]… [FILE]…
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
[root@localhost ~]# cat issue.out I am xiaoshui How are you haha how old are you [root@localhost ~]# cat -E issue.out I am xiaoshui $ $ $ How are you $ $ haha$ how old are you$ $ [root@localhost ~]# cat -A issue.out I am xiaoshui $ $ $ How are you^I^I$ $ haha$ how old are you$ $ [root@localhost ~]# cat -b issue.out 1 I am xiaoshui 2 How are you 3 haha 4 how old are you [root@localhost ~]# cat -sb issue.out 1 I am xiaoshui 2 How are you 3 haha 4 how old are you [root@localhost ~]# tac /etc/passwd //tac将cat查看的结果反过来 mage:x:4343:4346::/home/mage:/bin/bash wang:x:4342:4345::/home/wang:/bin/bash ash:x:4341:4343::/home/ash:/bin/bash nologin:x:4340:4342::/home/nologin:/etc/nologin basher:x:4339:4341::/home/basher:/bin/bash testbash:x:4338:4340::/home/testbash:/bin/bash bash:x:4337:4339::/home/bash:/bin/bash xiaoxiao:x:4336:4338::/home/xiaoxiao:/bin/bash xiaoming:x:4335:4337::/home/xiaoming:/bin/bash xiaosming:x:4334:4336::/home/xiaosming:/bin/bash jixingshui:x:4333:4335::/home/jixingshui:/bin/bash tomch:x:4331:4334::/home/tom:/bin/bash
head [OPTION]… [FILE]…
-c #: 指定获取前#字节
-n #: 指定获取前#行
-#:指定行数
[root@localhost ~]# head /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 adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]# head -c 1 /etc/passwd r[root@localhost ~]# head -n2 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@localhost ~]# head -n2 /et
tail
tail [OPTION]… [FILE]…
-c #: 指定获取后#字节
-n #: 指定获取后#行
-#:
-f: 跟踪显示文件新追加的内容,常用日志监控
[root@localhost ~]# tail /etc/passwd xiaosming:x:4334:4336::/home/xiaosming:/bin/bash xiaoming:x:4335:4337::/home/xiaoming:/bin/bash xiaoxiao:x:4336:4338::/home/xiaoxiao:/bin/bash bash:x:4337:4339::/home/bash:/bin/bash testbash:x:4338:4340::/home/testbash:/bin/bash basher:x:4339:4341::/home/basher:/bin/bash nologin:x:4340:4342::/home/nologin:/etc/nologin ash:x:4341:4343::/home/ash:/bin/bash wang:x:4342:4345::/home/wang:/bin/bash mage:x:4343:4346::/home/mage:/bin/bash [root@localhost ~]# tail -n 5 /etc/passwd basher:x:4339:4341::/home/basher:/bin/bash nologin:x:4340:4342::/home/nologin:/etc/nologin ash:x:4341:4343::/home/ash:/bin/bash wang:x:4342:4345::/home/wang:/bin/bash mage:x:4343:4346::/home/mage:/bin/bash [root@localhost ~]#
cut [OPTION]… [FILE]…
-d DELIMITER: 指明分隔符,默认tab
-f FILEDS:
#: 第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段, 例如1-6
混合使用:1-3,7
-c按字符切割
–output-delimiter=STRING指定输出分隔符
[root@localhost ~]# cut -d: -f1 /etc/passwd root bin daemon adm lp [root@localhost ~]# cut -d: -f1,3,5 /etc/passwd root:0:root bin:1:bin daemon:2:daemon adm:3:adm [root@localhost ~]# cut -d: -f1-5 /etc/passwd root:x:0:0:root bin:x:1:1:bin daemon:x:2:2:daemon adm:x:3:4:adm lp:x:4:7:lp [root@localhost ~]# cut -d: -f1-5 --output-delimiter='=' /etc/passwd root=x=0=0=root bin=x=1=1=bin daemon=x=2=2=daemon adm=x=3=4=adm
paste 合并两个文件同行号的列到一行
paste [OPTION]… [FILE]…
-d 分隔符:指定分隔符,默认用TAB
-s : 所有行合成一行显示
paste f1 f2
paste -s f1 f2
[root@localhost ~]# cp /etc/issue issue.out cp: overwrite ‘issue.out’? y [root@localhost ~]# paste /etc/issue issue.out \S \S Kernel \r on an \m Kernel \r on an \m Mage Education Learning Services Mage Education Learning Services http://www.magedu.com http://www.magedu.com tty is \l tty is \l hostname is \n hostname is \n current time is \t current time is \t [root@localhost ~]# paste -s /etc/issue \S Kernel \r on an \m Mage Education Learning Services http://www.magedu.com tty is \l hostname is \n current time is \t
分析文本文件:
文本数据统计:wc
整理文本:sort
比较文件:diff和patch
WC: 计数单词总数、行总数、字节总数和字符总数
-l来只计数行数
-w来只计数单词总数
-c来只计数字节总数
-m来只计数字符总数
[root@localhost ~]# wc issue.out //不加参数默认依次显示行,单词,字符数 9 21 123 issue.out [root@localhost ~]# wc -l issue.out 9 issue.out [root@localhost ~]# wc -c issue.out 123 issue.out [root@localhost ~]# wc -w issue.out 21 issue.out [root@localhost ~]# wc -m issue.out 123 issue.out
sort:文本排序
$sort[options]file(s)
常用选项
-r执行反方向(由上至下)整理
-n执行按数字大小整理
-f选项忽略(fold)字符串中的字符大小写
-u选项(独特,unique)删除输出中的重复行
-t c选项使用c做为字段界定符
-k X选项按照使用c字符分隔的X列来整理能够使用多次
[root@localhost ~]# sort -t: -k3 -n /etc/passwd hu root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]# sort -t: -k3 -n -r /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin mage:x:4343:4346::/home/mage:/bin/bash wang:x:4342:4345::/home/wang:/bin/bash ash:x:4341:4343::/home/ash:/bin/bash nologin:x:4340:4342::/home/nologin:/etc/nologin basher:x:4339:4341::/home/basher:/bin/bash testbash:x:4338:4340::/home/testbash:/bin/bash [root@localhost ~]# sort -u out hahahahahah ixingshui j jixingshui nihaoa [root@localhost ~]# cat out hahahahahah jixingshui jixingshui j ixingshui nihaoa jixingshui
uniq命令:从输入中删除重复的前后相接的行
uniq[OPTION]… [FILE]…
-c: 显示每行重复出现的次数
-d: 仅显示重复过的行
-u: 仅显示不曾重复的行
连续且完全相同方为重复
[root@localhost ~]# cat out xiaoshui nihaoa xiaoshui xiaoshui xiaoshui jane jane hahah hahah [root@localhost ~]# uniq -c out 1 xiaoshui 1 nihaoa 3 xiaoshui 2 jane 2 hahah 1 [root@localhost ~]# sort -r out | uniq -c //常和sort一同使用 4 xiaoshui 1 nihaoa 2 jane 2 hahah 1
diff命令的输出被保存在一种叫做“补丁”的文件中
使用-u选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件。
patch命令复制在其它文件中进行的改变(要谨慎使用!)
适用-b选项来自动备份改变了的文件
$diff-ufoo.conf-brokenfoo.conf-works>foo.patch
$patch-bfoo.conf-brokenfoo.patch
Linux上文本处理三剑客
grep:文本过滤(模式:pattern)工具;
sed:stream editor,文本编辑工具;
awk:Linux上的实现gawk,文本报告生成器;
grep: Global search REgularexpression and Print out the line
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE…]
grep命令选项:
–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
基本正则表达式元字符:
字符匹配:
.:匹配任意的单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:]
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数;默认工作与贪婪模式;
*:匹配其前面的字符任意次;0,1,多次;
.*:匹配任意长度的任意字符;
\?:匹配其前面的字符的0次或1次;即其前面的字符是可有可无的;
\+:匹配其前面的字符1次或多次;即其前面的字符要出出现至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次;
\{m,\}:至少m次;
位置锚定:
^:行首锚定;用于模式的最左侧;
$: 行尾锚定;用于模式的最右侧;
^PATTERN$ 用于PATTERN来匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
单词:非特殊字符组成的连续字符(字符串)都称为单词;
\<或\b:词首锚定,用于但此模式的左侧;
\>或\b:词尾锚定,用于单词模式的右侧;
\<PATTERN\>:匹配完整单词
分组及引用
\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中;这些变量为:
\1:模式从左侧其,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\2:模式从左侧其,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
\3:…
(a+(b-c)*d) 括号可嵌套不可交叉
[root@localhost ~]# grep "xiaoshui" out xiaoshui xiaoshui xiaoshui xiaoshui [root@localhost ~]# grep -v "xiaoshui" out nihaoa jane jane hahah hahah [root@localhost ~]# cat out xiaoshui nihaoa xiaoshui xiaoshui xiaoshui jane jane [root@localhost ~]# grep -q "xiaoshui" out [root@localhost ~]# [root@localhost ~]# grep -o "root" /etc/passwd root root root root root root root root [root@localhost ~]# grep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin chroot:x:1003:1003::/home/chroot:/bin/bash rooter:x:3320:4327::/home/rooter:/bin/bash
练习题:
1、找出ifconfig命令结果中本机的所有IPv4地址
2、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
egrep: 扩展正则表达式
字符匹配:
.:任意单个字符
[]:指定范围内的任意的单个字符
[^]:指定范围外的任意单个字符
次数匹配:
*:任意次,0,1,或多次;
?:0次或1次,其前面的字符是可有可无的
+:其前面的字符至少一次;
{m}:其前面的额字符m次;
{m,n}:至少m次,至多n次;
{0,m}
{m,}
位置锚定:
^:行首锚定;
$: 行尾锚定;
\<,\b:词首锚定;
\>,\b: 词尾锚定;
分组及应用:
():分组;括号内的模式匹配到的字符会被记录与正则表达式引擎的内部变量中;
后向引用:\1,\2…
或:
a|b:a或者b;
C|cat: C或者cat
(c|C)at:cat或Cat
练习题:
1、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
2、使用egrep取出/etc/rc.d/init.d/functions中其基名
grep与egrep功能十分强大,需要多思考多练习,慢慢地熟练掌握它,才能在以后的工作中得心应手的使用它。
原创文章,作者:我的滑板鞋,如若转载,请注明出处:http://www.178linux.com/30049