Linux之文本处理命令

Sort

         将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

 

         -u     在输出行中去除重复行

         -r      改为降序(默认升序)

         -o     将排序结果输出到原文件中(sort –r file.txt –o file.txt)

         -n     以数值来排序(默认是以字符来排序,比如10比2小)

         -t和-k      其中-t后面跟设定的间隔符,若为空格则用单引号将空格括起来,-k来指定列数(以哪一列来排序)

 

         -f      将小写字母都转换为大写字母来进行比较,亦即忽略大小写

         -c     检查文件是否排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

         -C     检查文件是否排好序,如果乱序,不输出内容,仅返回1

         -M    以月份来排序

         -b     忽略每一行前面的所有空白部分,从第一个可见字符开始比较

         -I      表示忽略不可打印字符,只针对可打印字符(\a,\b,\n,\r都是不可打印字符)

 

         -k:

可以写多个    -k 数字,在前面的优先级高,前面相同的就按后面的排序

-k 3r          表示第三个域按降序排序

-k 3nr       表示第三个域按降序以数值排序

如果将-n写在最前面,那么后面的域里面不用写n,都是按照以数值排序

 

-k 1.2        表示对第一个域的第二个字符开始到这个域的最后一个字符为止的字符串进行排序

-k 1.2,1.2          表示只针对第一个域的第二个字符排序

-k 3,3        表示只对本域排序,若没有后面那个3,则变成对第3个域开始到最后一个域位置的内容进行排

-k 1.1,1.1 –u    从第一个域的第一个字符开始,遇到相同的删掉本身后面一个字符靠后的

-k 2 –k 1 –k 3 –u      只要有一个有不同就不会轻易删除,-u会权衡所有-k选项,除非全部相同

Sort认为0小于00小于000小于0000…

-k 2.2,3.1          sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,不会把第三个域的开头字符纳入比较范围

 

 

 

 

 

Cut

         三种定位:-b         字节

                            -c          字符

                            -f           域

 

         -b

                  Who|cut –b 3          提取第3个字节

                  Who|cut –b 3-5,8   提取第3个,第4个,第5个,第8个字节

                  其中cut –b 3-5,8与cut –b 8,3-5不同,所有定位会从小到大排序

         -b -3表示从第一个字节到第三个字节,而-b 3-表示从第三个字节到行尾,且都包括了第3个字节

                  -b -3,3-表示输出整行,不会出现连续两个重叠的第3个字节

 

         -c

                  以字符为单位,可以输出中文

                  -n用于告诉cut不要将多字节字符拆开    -nb 1,2,3便可以输出一个汉字

 

         -f

                  cut –d : -f 1      以:为间隔符,提取第1个域

                  -f 3-5        提取第3个,第4个,第5个域

                  -f 4-          提取第4个域到最后一个域

                  Cut的-d选项的默认间隔符就是制表符,省略-d选项代表使用制表符,直接用-f来取域

                  -d ‘ ‘          以空格为间隔符,两个引号之间有空格

paste

         将不同文件的数据放在一行

         格式:

                  Paste  <-d><-s>  file1  file2

 

         -d     制定不同于空格或tab键的域分隔符。比如使用@分隔符,就可以-d@。d” ”

         -s      将每个文件合并成行,而不是按行合并(每个文件中的内容占一行)

         -       使用标准输入

 

cat a.txt

a

b

c

cat 1.txt

1

2

3

 

paste a.txt 1.txt

a1

b2

c3

 

paste –d @ a.txt 1.txt

a@1

b@2

c@3

 

paste –s a.txt 1.txt

abc

123

 

#ls

1.txt 2.txt

#ls | paste(默认是一个-,从标准输入读取一个作为一行)

1.txt

2.txt

#ls | paste –

1.txt

2.txt

#ls | paste - -(两个-之间用空格分开,有多少个-,就取多少个作为一行)

1.txt2.txt

Tr

格式:

         tr –c –d –s [“string1_to_translate_from”][“string2_to_translate_to”] < input-file

 

         -c     用字符串1中字符集的补集替换此字符集,要求字符集为ASCII

         -d     删除字符串1中所有输入字符

         -s      删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串

         input-file  是转换文件名

 

         指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表

         [a-z]a-z内的字符组成的字符串

         [A-Z]A-Z内的字符组成的字符串

         [0-9]数字串

         \octal       一个三位的八进制数,对应有效的ASCII字符

         [O*n]       表示字符O重复出现指定次数n。因此是匹配OO的字符串

        

         \a Ctrl-G 铃声\007

         \b Ctrl-H  退格符\010

         \f Ctrl-L    走行换页\014

         \n Ctrl-J   新行\012

         \r Ctrl-M  回车\015

         \t Ctrl-I    tab键\011

         \v Ctrl-X\ 030

 

 

应用例子

tr –s “[a-z]” <oops.txt > result.txt

         去除oops.txt里面的重复的小写字符

 

tr –s “[\012]” < plan.txt 或 tr –s [“\n”] < plan.txt

         删除空行

 

tr –s “[\015]” “[\n]” < file 或 tr –s “[\r]” “[\n]” < file

         删除文件中的^M,并代之以换行

 

cat a.txt |tr “[a-z]” “[A-Z]” > b.txt

         大写到小写

 

tr –cs “[a-z][A-Z]” “[\012*]” <diary.txt

         将文件每行所有不包含在[a-z]或[A-Z]的字符串放在字符串1中并转换为一新行。-s表示压缩所有新行,-c表示保留所有字母不动

 

 

转换控制字符

#cat –v stat.txt                  显示stat.txt的控制字符

box aa^^^^^12^M

apple bbas^^^^23^M

^Z

猜想‘^^^^^’是tab键,每一行以Ctrl-M结尾,文件结尾Ctrl-Z

使用-s选项,查看ASCII表。^的八进制代码是136,^M是015,tab键是011,^Z是032

tab键替换^^^^^,命令为”\136” “[\011*]”。将结果重定向到临时工作文件stat.tmp

tr –s “[\136]” “[\011*]” <stat.txt >stat.tmp

用新行替换每行末尾的^M,并用\n去除^Z,输入要来自于临时工作文件stat.tmp

tr –s “[\015][\032]” “\n” <stat.tmp

要删除所有的tab键,代之以空格,使用命令

tr –s “[\011]” “[\040*]” <input.file

 

 

tr –s “[:]” “[\011]” </etc/passwd或tr –s “[:]” “[\t]” </etc/passwd

         替换passwd文件中所有冒号,代之以tab键,可以增加可读性

 

echo $PATH | tr “:” “\n”

         将冒号改为回车

 

可以在vi里面使用所有的命令,记住:在tr命令前要加上希望处理的行范围和感叹号(!),如1,$!tr –d ‘\t’(美元符号表示最后一行)

Tee

功能说明:读取标准输入的数据,并将其内容输出成文件

语法:tee [-ai] [--help] [--version] [文件…]

补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。可利用tee把管道导入的数据存成文件,甚至一次保存数份文件

参数:

         -a     附加到既有文件的后面,而非覆盖它

         -i      忽略中断信号

         --help       在线帮助

         --version  显示版本信息

 

范例:

#cat slayers.story |tee ss-copy1 ss-copy2 ss-copy3

         列出文本文件slayers.story的内容,同时复制3份副本,文件名称分别为ss-copy1 ss-copy2 ss-copy3

 

tee file     //覆盖

tee –a file         //追加

tee -        //输出到标准输出两次

tee - -       //输出到标准输出三次

tee file1 file2 -        //输出到标准输出两次,并写到那两个文件中

 

#tee testfile

         生成一个文件,包含你敲入的内容

#tee –i testfile

         结果同testfile,不过不会接收中断信号,只能用Ctrl+d结束,不能用Ctrl+c

 

#ls | tee test

         执行ls列出目录文件同时将输出保存到文件test中

 

#ls “adfxaffewfasdf” 2>&1 | tee ls.txt

         把标准错误输出也保存到文件

Uniq

可以去除排序过的文件中的重复行,因此uniq经常和sort何用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的,若有重复行却没在相邻,那么uniq不会删除的

 

选项:

         -c     可在每个输出行之前加上该行重复的次数

         -d     仅显示重复的行

         -u     显示没有重复的行

         -i      忽略大小写字符的不同

 

#cat testfile

hello

world

friend

hello

world

hello

 

#sort testfile | uniq –c

1 friend

3 hello

2 world

 

#sort testfile | uniq –dc

3 hello

2 world

 

#sort testfile | uniq –u

friend

 

猜你喜欢

转载自www.cnblogs.com/chy-op/p/10055520.html