16 文本处理工具

文本处理工具一

一、杂项知识整理

1、ps axo user,ruser,cmd 查看命令发起者的身份和真正的登录身份:

[root@localhost test]# ps axo user,ruser,cmd
USER     RUSER    CMD
root     root     /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root     root     [kthreadd]
root     root     [ksoftirqd/0]
root     root     [kworker/0:0H]
root     root     [migration/0]
root     root     [rcu_bh]
root     root     [rcuob/0]
root     root     [rcuob/1]

2、windows文本在Linux中,回车为^M$,linux文本中tab在文本当中表示为^I。

    cat -n 加行号

        -b 非空行编号

        -s 压缩连续的空行成一行

[root@localhost test]# cat -s test.txt
abbcc abc ccabb
abc dd      
acbabc
      
aaccbbabcacbabc
abbccdba        c
bbb
aaa
     
ccc     
123456
abc123

        -A 显示所有的控制符

        -E 显示行结束符$

3、root的umask较大因此创建的文件权限较小,是为了限制其它用户访问。root可以随时更改自己的umask。

4、rev命令:每行的内容反向:

[root@localhost test]# rev test.txt
bbacc cba ccbba
      dd cba
      cbabca
cbabcacbabbccaa
c        abdccbba
bbb
     aaa
     ccc
654321
321cba

5、suid和sgid作用于二进制程序上有效,sgid可以作用于目录。echo为内置命令,使用sgid时不能与一般的二进制程序相同。

6、perl语言的发明人,拉里.沃尔,发明diff命令。awk是三个发明人的姓名首字母。

二、命令详解及事例

今天学习了文本处理工具,包括wc,cut,sort,more,less,uniq,diff,patch,rev,head,tail,grep,egrep以及fgrep。我们在/testdir中建立一个文件test.txt内容如下,来实现今天许多文本处理工具的一些命令演示,以加强认识。

[root@localhost test]# cat test.txt
abbcc abc ccabb
abc dd
acbabc


aaccbbabcacbabc

abbccdbac
bbb
aaa


ccc
123456
abc123

1、关于more:查看文件内容或者接收标准输入的内容,只能往下翻页,到底便退出,操作是回车一行一行查看,回车翻页。也可以通过管道接收文件列表。

2、less:查看文本信息,man默认调用的工具。同样可以接收文件列表。快捷键:空格翻屏,回车下一行,f翻屏,d翻半屏,u往上翻半屏,n默认翻三行,g回到顶部,q退出。

3、head命令:获取前几行的内容,默认为十行。

    -c #  指定获取前#字节

    -n #  指定获取前#行 与 -#   指定行数相同:

[root@localhost test]# head test.txt 
abbcc abc ccabb
abc dd      
acbabc      
aaccbbabcacbabc
abbccdba        c
bbb
aaa     
[root@localhost test]# head -c 20 test.txt 
abbcc abc ccabb
abc [root@localhost test]# head -n3  test.txt 
abbcc abc ccabb
abc dd      
acbabc      
[root@localhost test]# head -3  test.txt 
abbcc abc ccabb
abc dd      
acbabc

4、tail命令:与head命令基本相反:显示后几行内容,比head更要常用。

    -c # 指定获取后#字节

    -n # 指定获取后#行 与 -#相同

    -f 跟踪显示文件新追加的内容,常用于日志监控:操作如下:找到日志文件执行命令,放入后台执行:

[root@centos68 testdir]# tail -n0 -f aaa.log & 
[1] 4180

在另一个终端执行任务改变了文件时,后台执行任务的终端就会出现新行信息但不影响操作:

[root@centos68 testdir]# echo "aaa" >> aaa.log  (console1)
[root@centos68 testdir]# aaa(console2)

关闭后台任务:

[root@centos68 testdir]# fg %1
tail -n0 -f aaa.log
^C

5、cut命令:

    -d 分隔符 : 指明分隔符,默认tab

    -f #  :第几个字段,可以是好几段如:-f1,3,5-10 

    -c  按字符切割  –output=delimiter=STRINGG指定输出分隔符

[root@localhost test]# cut -db -f 1,3  test.txt --output-delimiter=:
a:cc a
a
ac:c      
aacc:a
a:ccd
:
aaa     
ccc     
123456
a
[root@localhost test]# cut -c 2-4 test.txt 
bbc
bc 
cba
acc
bbc
bb
aa 
cc 
234
bc1

6、paste命令(粘贴):合并两个文件同行号的列到一行:

    -d 分隔符:指定分隔符,默认用tab

    -s 所有行合成一行显示:每个文件自己的行合成

[root@localhost test]# paste -d:  aaa.log test.txt 
abc:abbcc abc ccabb
abc:abc dd      
abc:acbabc      
abc:
adfasdfadsf:
adfasdfadsf:aaccbbabcacbabc
[root@localhost test]# paste -s  aaa.log test.txt 
abcabcabcabcadfasdfadsfadfasdfadsf
abbcc abc ccabbabc dd      acbabc      aaccbbabcacbabcabbccdba 
       cbbbaaa     ccc     123456abc123

7、wc命令:计数单词总数、行总数、字节总数和字符总数:可以对文件或STDIN(标准输入)中的数据运行:

        -l 只计数行数

        -w 只计数单词总数

        -c 只计数字节总数

        -m 只计数字符总数

[root@localhost test]# wc aaa.log 
 6  6 40 aaa.log
[root@localhost test]# wc -l aaa.log 
6 aaa.log
[root@localhost test]# wc -w aaa.log 
6 aaa.log
[root@localhost test]# wc -c aaa.log 
40 aaa.log
[root@localhost test]# wc -m aaa.log 
40 aaa.log

8、sort命令:把整理过的文本显示在标准输出(STDOUT),不改变原始文件。

    -r 反向整理

    -n 按数字大小整理

    -f (fold)选项忽略字符串中的字符大小写

    -u 选项删除输出中的重复行,例子中其实是有空行的,多行空行被删除只留了一行

    -t # 选项使用#作为字段界定符(文件中有的,类似cut -d)

        -k N 选项按照使用#字符分隔的N列来整理,默认字符顺序排序。   

[root@localhost test]# sort -r test.txt 
ccc     
bbb
acbabc      
abc dd      
abc123
abbccdba        c
abbcc abc ccabb
aaccbbabcacbabc
aaa     
123456
[root@localhost test]# sort -n test.txt 
aaa     
aaccbbabcacbabc
abbcc abc ccabb
abbccdba        c
abc123
abc dd      
acbabc      
bbb
ccc     
123456
[root@localhost test]# sort -f test.txt 
123456
aaa     
aaccbbabcacbabc
abbcc abc ccabb
abbccdba        c
abc dd      
abc123
acbabc      
bbb
ccc     
[root@localhost test]# sort -u test.txt 
123456
aaa     
aaccbbabcacbabc
abbcc abc ccabb
abbccdba        c
abc123
abc dd      
acbabc      
bbb
ccc  
[root@localhost test]# sort -t: -k 3 -n  /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
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin   
[root@localhost test]# sort -t: -k 3 -nr  /etc/passwd
bash:x:2231:2231::/home/bash:/bin/bash
tom:x:2230:3003::/home/tom:/bin/bash
alice:x:2229:3002::/home/alice:/bin/bash
user6:x:2228:2228::/home/user6:/bin/bash
user5:x:2227:2227::/home/user5:/bin/bash
user4:x:2226:2226::/home/user4:/bin/bash
user3:x:2225:2225::/home/user3:/bin/bash
user2:x:2224:2224::/home/user2:/bin/bash
user1:x:2223:2223::/home/user1:/bin/bash
sarah:x:1008:1010::/home/sarah:/bin/nologin
harry:x:1007:1009::/home/harry:/bin/bash
natasha:x:1006:1008::/home/natasha:/bin/bash
gentoo:x:1005:1006:gentoo distribution:/home/gentoo:/

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

    -c 显示每行重复出现的次数

    -d 仅显示重复过的行

    -u 仅显示不重复的行

常和sort一起配合使用

[root@localhost test]# uniq -c test.txt 
      1 abbcc abc ccabb
      1 abc dd      
      1 acbabc      
      1 
      1 aaccbbabcacbabc
      1 
      1 abbccdba        c
      3 bbb
      1 aaa     
      1 
      1 aaa
      1 ccc     
      1 123456
      1 abc123
[root@localhost test]# uniq -d test.txt
bbb
[root@localhost test]# uniq -u test.txt 
abbcc abc ccabb
abc dd      
acbabc      
aaccbbabcacbabc
abbccdba        c
aaa     
aaa
ccc     
123456

10、diff命令,比较文件。

[root@localhost test]# diff test.txt test1.txt 
2c2
< 
---
> abc dd      
3a4
> 
6a8
> bbb

diff用于恢复文件,同时使用patch,需要事先用命令-u(unified统一的)将diff比较后的结果输出至文件。

[root@localhost test]# diff -u test.txt test1.txt  >  testbak.txt
[root@localhost test]# rm -f test1.txt 
[root@localhost test]# patch -b test.txt 
aaa.log      testbak.txt  test.txt     
[root@localhost test]# patch -b test.txt testbak.txt 
patching file test.txt
[root@localhost test]# ls
aaa.log  testbak.txt  test.txt  test.txt.orig

首先将对比后的结果输入备份文件,diff -u  FILE(BROKEN)  FILE(WORKS)  >  FILE.PATCH

然后恢复原WORK文件:diff  -b  FILE(BROKEN) FILE.PATCH

三、练习及作业

1、统计/etc/init.d/functions中的每个单词的使用次数:一部分结果:

[root@centos68 testdir]# cat /etc/init.d/functions  |tr -cs [:alpha:] '\n'|sort  |uniq -c 
      1 
     31 a
      5 A
      1 aA
      2 above
     12 action
      2 all
     16 ALL
      2 ALLNETDEVMTAB
      2 already
      1 an
      5 and
      1 And
      5 answer
      3 any
      1 anywhere
      1 apply
      1 Apply
      4 are
      8 arg
      1 args
      1 as
      1 ask
      2 at
      1 avoid
     23 awk
     14 b
      3 back
      1 backup
      2 bak
     36 base

此命令中:tr -sc 是取补集c和合并所有空行为一行。[:alpha:]不能写为[[]]的原因:两个括号代表至匹配一个字符,连续出现好几个特殊字符的情况就不会成功,一个括号代表通配,指所有的。BUG:出现S.U.S.E.这种单词会被拆为四个单词。

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

(0)
SilencePavilionSilencePavilion
上一篇 2016-08-05 10:17
下一篇 2016-08-05 10:17

相关推荐

  • Linux基础知识(三)-用户管理组管理,正则grep,文本处理

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,只显示一次即可。 2、取出最后登录到当前系统的用户的相关信息。 3、取出当前系统上被用户当作其默认shell的最多的那个shell。 4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中 5、取出当前主机的IP…

    Linux干货 2016-10-09
  • 推荐-LVS原理详解

    LVS原理详解 LVS原理详解 LVS简介 LVS结构与工作原理 一.LVS的结构 二.LVS内核模型 三.LVS的包转发模型 1.NAT模型: 2.DR模型: 3.TUN模型: 四.LVS的调度算法 LVS的调度算法分为静态与动态两类。 1.静态算法(4种):只根据算法进行调度 而不考虑后端服务器的实际连接情况和负载情况 2.动态算法(6种):前端的调度器…

    Linux干货 2016-03-27
  • 马哥教育首届IT技术博客大赛–结果揭晓

    号外、号外!!马哥教育首届博客大赛已圆满结束。感谢小伙伴们的积极参与! 噼里啪啦,小伙伴们掌声响起来,啤酒烤鸭high起来~~咳咳,跑题了,小编好像忘了一件很重要的事: 马帮博客大赛就是与众不同,全银河系也就仅此一家,为啥这么说呢,您看啊,咱就喜欢原创,鼓励原创,酷爱原创,以原创博客作为技术交流的平台供大家随意围观和吐槽,您看看,除了马哥这里,哪里还有这么自…

    Linux干货 2016-06-22
  • 第十周

    请详细描述CentOS的启动流程     启动第一步–加载BIOS         当打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它,这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信…

    Linux干货 2017-01-03
  • 文件系统

            文件系统表现为单个统一的层次结构:从目录/开始并通过若干数量的子目录继续向下扩展,/也叫做根目录。这种单一的层次系统和 Windows 的不一样,后者的分区有专门的名字空间。        &n…

    Linux干货 2016-02-28
  • rsyslog日志系统

    一、前言  什么是日志?    日志就是历史事件,按时间序列将发生的事件予以记录;日志记录信息记录的是事件的发生时间以及事件内容  Linux下记录日志的系统:    syslog:是CentOS 5.0系统上使用的日志系统,有两类日志,分别是syslogd、klogd;    …

    Linux干货 2015-06-15