码迷,mamicode.com
首页 > 其他好文 > 详细

文本基本处理工具

时间:2017-11-26 22:01:04      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:linux文件

(一).整个文本输出

  • cat

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 (反向列示)

说明:

tac 是将 cat 反写过来,所以他的功能就跟 cat 相反, cat 是由第一行到最后一行连续显示在萤幕上,而 tac 则是由最后一行到第一行反向在萤幕上显示出来!

  • rev       (reverse)

这个命令和cat也是反的,  不过它不像tac那样, 它输出行的顺序和cat也是一样的, 不过输出每行的时候, 先输出最后一个字符, 接着是倒数第二个字符, 最后才是第一个字符, 下面这个命令可以把输入全部倒过来:

[root@bash ~]# cat re
  one apple a day!

two apple two day!
  [root@bash ~]# rev re
  !yad a elppa eno

!yad owt elppa owt

  • more

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

输出:

[root@localhost test]# cat log2012.log 

2012-01

2012-02

2012-03

2012-04-day1

======
  [root@localhost test]# more +3 log2012.log 

2012-03

2012-04-day1

======

实例2:从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出

命令:

more +/day3 log2012.log

输出:

[root@localhost test]# more +/day3 log2012.log 

...skipping

2012-04-day1

2012-04-day2

2012-04-day3

2012-05

实例3:设定每屏显示行数

命令:

more -n 3 log2012.log

输出:

[root@localhost test]# more -n 3 log2012.log 

2012-01

2012-02

2012-03

说明:

如下图所示,最下面显示了该屏展示的内容占文件总行数的比例,按 Ctrl+F 或者 空格键 将会显示下一屏5条内容,百分比也会跟着变化。

  • less

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:反向重复前一个搜索(与 /  ? 有关)

向后翻一页

向后翻半页

显示帮助界面

退出less 命令

向前滚动半页

向前滚动一行

空格键 滚动一行

回车键 滚动一页

[pagedown] 向下翻动一页

[pageup]  向上翻动一页

注:less可同时查看多个文件使用n或者p进行切换

(二).部分输出

  • head

1.命令格式:

head [参数]... [文件]...

2.命令功能:

head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。

3.命令参数:

-q 隐藏文件名

-v 显示文件名

-c<字节显示字节数

-n<行数显示的行数

4.使用实例:

实例1:显示文件的前n

命令:

head -n 3 log2014.log

输出:

[root@localhost test]# cat log2014.log 

2014-01

2014-02

2014-03

2014-04

==============================

[root@localhost test]# head -n 5 log2014.log 

2014-01

2014-02

2014-03

实例2:显示文件前n个字节

命令:

head -c 20 log2014.log

输出:

[root@localhost test]# head -c 20 log2014.log

2014-01

2014-02

2014

实例3:文件的除了最后n个字节以外的内容

命令:

head -c -32 log2014.log

输出:

[root@localhost 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

输出:

[root@localhost test]# head -n -6 log2014.log

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

2014-07

  • tail

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行内容

输出:

[root@localhost 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

输出:

[root@localhost ~]# ping 192.168.120.204 > test.log &

[1] 11891[root@localhost ~]# 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;这种做法也使用于一个以上的档案监视。用Ctrlc来终止。

实例3:从第5行开始显示文件

命令:

tail -n +5 log2014.log

输出:

[root@localhost test]# cat log2014.log 

2014-01

2014-02

2014-03

2014-04

2014-05

2014-06

==============================

[root@localhost test]# tail -n +5 log2014.log

2014-05

2014-06

==============================

 

  • hexdump

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个字节,默认输入十进制,以0x0X开始按16进制处理,否则如以0开始按八进制处理,如果以b/k/m结尾,则原数值乘以512/1024/1048576

-v 显示所有数据,如果不包含这一选项,对于同上一行完全相同的数据,hexdump会以*代替显示

-x 两位十六进制显示.十六进制显示偏移量,每行8组数据,每数据占两字节,4列,不足补零,以空格分隔

3.实例:

[root@bash ~]# hexdump -n10 -v -C -s 10 /bin/cat
  0000000a   00 00 00 00 00 00 02 00   3e 00                     |........>.|

(三)按列抽取与合并

  • cut

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

1、命令格式:

cut [-bn] [file]  cut [-c] [file] cut [-df] [file]

2.使用说明:

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b-c -f 标志之一。

3主要参数:

:以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -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结合使用

实例一:以字节定位

[root@bash ~]# ll re
  -rw-r--r-- 1 root root 57 Jan   3 22:36 re
  [root@bash ~]# cat re
 
two apple two day!
  tree
  four
  five
  six
  [root@bash ~]# cut -b 1,2,5-7 re
  twapp
  tr
  fo
  fi
  si

实例二:以字符定位

[root@bash ~]# ll re
  -rw-r--r-- 1 root root 57 Jan   3 22:36 re
  [root@bash ~]# cat re
  one apple a day!

two apple two day!
  tree
  four
  five
  six
  [root@bash ~]# cut -c 1,3,6-8 re
  oeppl

toppl
  te
  fu
  fv

实例三:以域定位

[root@bash ~]# 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

[root@bash ~]# 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

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的内容合并为一行

实例:

[root@bash ~]# cat a
  aa

bb
  cc
  dd
  ee
  [root@bash ~]# cat b
  xx
  hh
  cc
  zz
  ll
  [root@bash ~]# paste a b
  aa      xx
          hh
  bb      cc
  cc      zz
  dd      ll
  ee
  [root@bash ~]# paste -d: a b   #
使用冒号作为分隔符
  aa:xx
  :hh
  bb:cc
  cc:zz
  dd:ll
  ee:
  [root@bash ~]# paste -s a b #a
文件合并一行,b文件合并一行
  aa              bb       cc      dd      ee
  xx      hh      cc      zz       ll

  • join

join将两个文件中,指定栏位内容相同的行连接起来。

1.命令格式:

join [-i][-a<12>][-e<字符串>][-o<格式>] [-t<字符>][-v<12>][-1<栏位>][-2<栏位>][--help] [--version][文件1][文件2]

2.命令参数:

-a<12>    除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。 

-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命令,就相当于数据库中的内连接,关键字不匹配的行不会输出。

[root@rhel55 linux]# cat month_cn.txt 
  1       
一月
  2       
二月
  3       
三月
  4       
四月
  5       
五月
  6       
六月
  7       
七月
  8       
八月
  9       
九月
  10     
十月
  11     
十一月
  12     
十二月
  13     
十三月,故意的 
  [root@rhel55 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月,这纯粹是为了方便演示。

[root@rhel55 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
  [root@rhel55 linux]#

示例二 左连接(又称左外连接,显示左边所有记录)显示左边文件中的所有记录,右边文件中没有匹配的显示空白。

[root@rhel55 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 
十三月
  [root@rhel55 linux]#

示例三 右连接(又称右外连接,显示右边所有记录)显示右边文件中的所有记录,左边文件中没有匹配的显示空白。

[root@rhel55 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 
  [root@rhel55 linux]#

**示例四 全连接(又称全外连接,显示左边和右边所有记录)**

[root@rhel55 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 
  [root@rhel55 linux]#

示例五 指定输出字段'比如参数 -o 1.1 表示只输出第一个文件的第一个字段。

[root@rhel55 linux]# join -o 1.1 month_cn.txt month_en.txt 
  1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  [root@rhel55 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
   [root@rhel55 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 
十二月
   [root@rhel55 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 
十二月 
  [root@rhel55 linux]#

示例六:我们知道 /etc/passwd 第四个字段是 GID那个 GID 记录在  /etc/group 当中的第三个字段,请问如何将两个文件整合?

[root@www ~]# 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
  # 
从上面可以看到,确实有相同的部分喔!赶紧来整合一下!

[root@www ~]# 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
  # 
同样的,相同的字段部分被移动到最前面了!所以第二个文件的内容就没再显示。

五、文本分析

  • wc

Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。

1.命令格式:

wc [选项]文件...

2.命令功能:

统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。

3.命令参数:

-c 统计字节数。

-l 统计行数。

-m 统计字符数。这个标志不能与 -c 标志一起使用。

-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。

-L 打印最长行的长度。

-help 显示帮助信息

--version 显示版本信息

4.使用实例:

实例1:查看文件的字节数、字数、行数

命令:

wc test.txt

输出:

[root@localhost test]# cat test.txt 

hnlinux

peida.cnblogs.com

Ubuntu

ubuntu linux

RedHat

Redhat

linuxmint

[root@localhost test]# wc test.txt

 7   8 70 test.txt

[root@localhost test]# wc -l test.txt 

7 test.txt

[root@localhost test]# wc -c test.txt 

70 test.txt

[root@localhost test]# wc -w test.txt 

8 test.txt

[root@localhost test]# wc -m test.txt 

70 test.txt

[root@localhost test]# wc -L test.txt 

17 test.txt

说明:

7 8 70 test.txt

行数 单词数 字节数 文件名

实例2:用wc命令怎么做到只打印统计数字不打印文件名

[root@localhost test]# wc -l test.txt 

7 test.txt

[root@localhost test]# cat test.txt |wc -l 或者 wc -l <  test.txt

7

说明:

使用管道线,这在编写shell脚本时特别有用。

实例3:用来统计当前目录下的文件数

命令:

ls -l | wc -l

输出:

[root@localhost test]# cd test6

[root@localhost 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

[root@localhost test6]# ls -l | wc -l

8

[root@localhost test6]#

说明:

数量中包含当前目录

  • sort

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 的账号进行排序

[root@www ~]# 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 内容是以 : 来分隔的,以第三栏来排序

[root@www ~]# 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

实例三:默认是以字符串来排序的,如果想要使用数字排序:

[root@www ~]#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

实例四:默认是升序排序,如果要倒序排序

[root@www ~]#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个字符进行正向排序,再基于第一个域进行反向排序。

[root@www ~]#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的第七个域进行排序,然后去重:

[root@www ~]#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命令可以去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的。

1.命令格式:

uniq [-idcu]

2.常用参数:

-i:忽略大小写字符的不同;
  -c
:显示每行重复的次数
  -u
:只显示唯一的行
  -d
:仅显示重复过的行

实例:

a.直接删除未经排序的文件,将会发现没有任何行被删除

[root@www ~]#cat testfile
  hello
  world
  friend
  hello
  world
  hello

[root@www ~]##uniq testfile   
  hello
  world
  friend
  hello
  world
  hello

b.排序文件,默认是去重

[root@www ~]##cat words | sort |uniq
  friend
  hello
  world

c.排序之后删除了重复行,同时在行首位置输出该行重复的次数

[root@www ~]##sort testfile | uniq -c
  1 friend
  3 hello
  2 world

d.仅显示存在重复的行,并在行首显示该行重复的次数

[root@www ~]##sort testfile | uniq -dc
  3 hello
  2 world

e.仅显示不重复的行

[root@www ~]#sort testfile | uniq -u
  friend

  • diff

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

现在对f1f2进行比较:

$ diff f1 f2

这时,diff就会显示正常格式的结果:

4c4
  < a
 
   ---
  > b

第一行是一个提示,用来说明变动位置。

4c4

它分成三个部分:前面的"4",表示f1的第4行有变化;中间的"c"表示变动的模式是内容改变(change),其他模式还有"增加"a,代表addition)和"删除"d,代表deletion);后面的"4",表示变动后变成f2的第4行。

第二行分成两个部分。

< a

前面的小于号,表示要从f1当中去除该行(也就是第4行),后面的"a"表示该行的内容。

第三行用来分割f1f2

---

第四行,类似于第二行。

> 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,将f1f2的上下文合并在一起显示。

它的使用方法是加入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行。它将两个文件的上下文,合并显示在一起,所以叫做"合并格式"。每一行最前面的标志位,空表示无变动(第一个文件、第二个文件共有)减号表示第一个文件删除的行,加号表示第二个文件新增的行。(第一个文件变化到第二文件 增删状况)

  • patch

实例:diff输出补丁文件,patch给旧文件打补丁

[root@bash ~]# cat f1
  Hi, 
  Hello, 
  How are you? 
  I am fine, 
  Thank you. 
  [root@bash ~]# cat f2
  Hello, 
  Hi, 
  How are you? 
  I am fine. 
   [root@bash ~]# diff -u f1 f2 > diff.patch   #
输出不定文件
  [root@bash ~]# patch -b f1 diff.patch    #patch
f1打补丁并且备份原来文件
  patching file f1
  [root@bash ~]# cat f1
  Hello, 
  Hi, 
  How are you? 
  I am fine.

六、文本字符转换

  • tr

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"

[root@localhost ~]# cat host

:a b c replace e f g replace this is a test page replace
  [root@localhost ~]# 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命令“统一”字母大小写

(小写 --> 大写)
   [root@localhost ~]# cat host | tr [a-z] [A-Z]

:A B C REPLACE E F G REPLACE THIS IS A TEST PAGE REPLACE

(大写 --> 小写)
   [root@localhost ~]# cat host | tr [A-Z] [a-z]

实例二:把f109转换为aj

[root@localhost ~]# cat f1
  A b c D

e F G H 9 0 8 7 63

h b mfd dgg
  [root@localhost ~]# 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"字符

[root@localhost ~]# cat host

:a b c replace e f g replace this is a test page replace
  [root@localhost ~]# cat host|tr -d 'replace'

: b     f g  this is  tst g

【注意】这里,凡是在host文件中出现的'r','p','l','a','c','e'字符都会被删除!而不是紧紧删除出现的"replace”字符串。

删除文件file中出现的换行'\n'、制表'\t'字符

[root@localhost ~]# cat file | tr -d "\n\t" > new_file

不可见字符都得用转义字符来表示的,这个都是统一的。

实例四:删除“连续着的”重复字母,只保留第一个

[root@localhost ~]# cat file | tr -s [a-zA-Z] > new_file

实例五:删除空行(连续的换行符删除,删除空行)

[root@localhost ~]# cat file | tr -s "\n" > new_file

实例六:删除Windows文件“造成”的'^M'字符

[root@localhost ~]# cat file | tr -d "\r" > new_file

或者

[root@localhost ~]# cat file | tr -s "\r" "\n" > new_file

【注意】这里-s后面是两个参数"\r""\n",用后者替换前者

实例七:用空格符\040替换制表符\011

[root@localhost ~]# cat file | tr -s "\011" "\040" > new_file

实例八:把路径变量中的冒号":",替换成换行符"\n"

[root@localhost ~]# echo $PATH | tr -s ':' '\n'
  /usr/local/sbin
  /usr/local/bin
  /sbin
  /bin
  /usr/sbin
  /usr/bin
  /root/bin

 

实例九:删除f1中除了数字换行之外的所有字符

[root@localhost ~]# cat f1

一月      1

二月      2

三月      3

四月      4

五月      5

六月      6

七月      7

八月      8

九月      9

十月      10

十一月    11

十二月    12 

十三月    13 

[root@localhost ~]# tr -cd '[0-9]\n' < f1

1

2

3

4

5

6

7

8

9

10

11

12

13

实例十:利用ifconfigipv4地址

[root@localhost  ~]# 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的权限用数字表示

[root@localhost  ~]# stat /tmp | tail -4|head -1|tr -s ' ' ':'|cut -d: -f2|tr -dc '[0-9]\n'

1777

实例十二:统计/etc/init.d/functions中每个单词重复的个数

[root@localhost  ~]# cat /etc/init.d/functions |tr -sc '[:alpha:]' '\n'|sort|uniq -c|sort -n

 

实例十四:分区空间使用率的最大百分比值

[root@zab  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

[root@zab  home]# df |tr -s ' ' %|cut -d% -f5 |sort -nr|head -1

100

实例十五:找出ifconfig “网卡名” 命令结果中本机的IPv4地址

[root@zab  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

[root@zab  home]# ifconfig eth1 |head -2|tail -1|tr -s ' ' ':'|cut -d: -f4

172.18.253.24

实例十六:查出用户UID最大值的用户名、UIDshell类型

[root@zab  home]# cat /etc/passwd |sort -t: -k3 -nr|head -1|cut -d: -f1,3,7

nfsnobody:65534:/sbin/nologin

实例十七:查出/tmp的权限,以数字方式显示

[root@zab  ~]# 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

[root@zab  ~]# stat /tmp |head -4|tail -1|tr -s ' '|cut -d' ' -f2|tr '(' '/'|cut -d'/'  -f2

1777

[root@zab  ~]# stat /tmp |head -4|tail -1|tr '(' '/'|cut -d'/' -f2

1777


文本基本处理工具

标签:linux文件

原文地址:http://blog.51cto.com/13157015/2044457

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!