码迷,mamicode.com
首页 > 系统相关 > 详细

shell脚本学习笔记之文本处理命令

时间:2015-08-04 23:13:00      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:cut   uniq   paste   cat   more   head   

shell脚本学习笔记之文本处理命令



一.cut (截取文本字符或域字段)
   命令格式:cut [option] file
  1.-d和-f的组合用法,用来截取字段
     说明:*表示分隔符,如-,:,空格字符等
           N表示第N个字段
   用法一:cut -d* -fN       从文本中截取每行以某个特定符号为分隔符的某个域字段
     例子:cut -d:-f1       从文本中截取每行以冒号(:)为分隔符的第一个域字段


   用法二:cut -d* -fNm-n    从文本中截取每行相邻的多个域字段
     例子:cut -d:-f1-3     从文本中截取每行以冒号(:)为分隔符的多个域字段


   用法三:cut -d* -fNm,n    从文本中截取每行不相邻的多个域字段
     例子:cut -d: -f1,3     从文本中截取每行的第一个到第三个字符


  2.-c用法     用来截取字符  
   用法一:cut -cN           从文本中截取一个字符
     例子:cut -c1           从文本中截取每行的第一个字符


   用法二:cut -cNm-n        从文本中截取每行相邻的多个字符多个字符
     例子:cut -c1-5         从文本中截取每行的第一个到第五个字符
 
   用法三:cut -cNm,n        从文本中截取每行不相邻的多个字符
     例子:cut -c1,5         从文本中截取每行字符中的第一个和第五个字符


***  注意:
        1.cut命令只能截取单个文件中的字符或域字段
        2.cut命令截取的字符或域字段是从所有行中截取的以列的形式显示到屏幕,而不是从某行或某些行中截取,也就是说cut命令不具备截取特定行特定字符或特定行特定域字段,只能从文本中所有行中截取,一般cut命令是针对具有某种排列次序的文本来使用的文本处理命令。


___________________________________________________________________________
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



二.uniq (去除文本中的重复行)
   命令格式:uniq [option] file
  1.uniq -c  显示文本中相同行连续重复的次数        
  例子1:[root@node1 tmp]# uniq -c job
      2 ggg
      2 jjjjjjjjjjjj
 
  例子2:[root@node1 tmp]# uniq -c job
      2 ggg
      2 jjjjjjjjjjjj
      1 ggg
      1 jjj
 
  2.uniq -d   显示文本中重复的行(只显示一次)
  例子:       [root@node1 tmp]# uniq -d job
        ggg
        jjjjjjjjjjjj


  3.uniq -u   显示文本中没有连续重复的行
  例子:       [root@node1 tmp]# uniq -u job
        ggg
        jjj


***注意:
       这里要着重理解连续重复和重复所代表不同意义



_______________________________________________________________________
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


三.paste(将不同文本中的数据合到新的文本)
   命令格式:paste [option] file1 file2


   1.paste file1 file2  将file1文本中的内容和file2文本中的内容显示为一个文本,同时将file1的内容作为第一个域字段,分隔符为tab(n个空格) 而file1作为第二个域字段显示,反之一样
 例子:  [root@node1 test]# paste passwd shadow
1.root:x:0:0:root:/root:/bin/bash root:$1$sovZvvQl$8HOSTtnMubbEdswFA3lnI/:16393:0:99999:7:::
bin:x:1:1:bin:/bin:/sbin/nologin bin:*:16393:0:99999:7:::
2.daemon:x:2:2:daemon:/sbin:/sbin/nologin daemon:*:16393:0:99999:7:::
3.adm:x:3:4:adm:/var/adm:/sbin/nologin adm:*:16393:0:99999:7:::
4.lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin lp:*:16393:0:99999:7:::
5.sync:x:5:0:sync:/sbin:/bin/sync sync:*:16393:0:99999:7:::
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown shutdown:*:16393:0:99999:7:::
6.halt:x:7:0:halt:/sbin:/sbin/halt halt:*:16393:0:99999:7:::
 


  2.paste -d* file1 file2  使用*(*可以为:或-或其他字符)为分隔符显示file1和file2组合后的新文本
  例子:[root@node1 tmp]# paste -d- a b
jjj-kkk


  3.paste -s file file2    将file1文本和file2文本以横向放入同一个文本中,也就是说先放file1文本,然后在下一行放                            file2文本,也就说新的文本只有两行,即file1为一行,file2为另一行


  4.paste -d* -s file file2  将file1文本和file2文本中本来不同行使用*分隔符区分,也就是说,原来的文本的每行内容之前用*分隔符作为域字段区分,而文本之间则以行区分。
  例子:[root@node1 tmp]# cat m n
a
b
c


o
p
q
  [root@node1 tmp]# paste -d: -s m n
a:b:c:
o:p:q


 5.ls | paste -d“ ” - - -  
 例子:[root@node1 tmp]# ls | paste -d" " - - - - -  -选项必须和ls及|结合使用
a b job m n
test tom  


***注意:paste命令需要理解横行,竖行,字段的转变



____________________________________________________________________________________
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



四、cat(一次性显示文本所有内容)
   cat [option] filename
   1.cat -A filename    显示文本所有内容
    
   2.cat -b filename    将文本中的行用编号进行排序显示(空白行不编号)
    
   3.cat -E filename    在文本的每行末尾显示$符号


   4.cat -n filename    将文本中的行用编号进行排序


   5.cat -s filename    将文本中连续的多个空白行显示为一个空白行


   6.cat -v filename    将文本中不可显示的字符(如制表符,新行符合换行符除外)显示出来



____________________________________________________________________________
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



五,more(以屏幕为单位逐屏显示文本内容)
    more [option] filename


    1.more -N filename   一次显示N行内容至屏幕


    2.more -d  filename  用于提示使用者如何逐屏查看文本内容和如何退出查看


    3.more -f filename   计算行数时,以实际行计数,而不是自动换行后的计数


    4.more -p filename   不以逐屏形式显示文本内容,而是先清除屏幕显示的文本内容,再显示其他内容


    5.more -c filename   先显示内容,再清除屏幕
   
    6.more -s filename  将多行空白行以一行计数


    7.more +/ filename  通过搜索字符串来开始显示字符串后所有内容


    8.more +n filename  通第n行开始显示文本内容


_______________________________________________________________________________
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


六、head
   head [option] filename
   1.head -N file     N表示查看文本前N行
例子
     head -8 file     查看文本前8行


++++++++++++++++++++++++++++++++++++++++++++++++++++++



七.tail
   tail  [option] filename
   1.tail -N file    N表示查看文本后N行
例子
    tail -8 file     查看文本后8行


+++++++++++++++++++++++++++++++++++++++++++++++++++++++


八.less
  less file  逐屏查看文本内容
  






+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


九.split  ----将一个大文件切割成多个小文件,并在小文件中自动编号
split [option] 带切割的大文件 输出的小文件


选项
-或-l 这两个选项等价,都用于指导切割成小文件行数
-b    指导切割成小文件的字节
-C    与-b选项类似,不过,切割时尽量维持每行的完整性


例子
split -2 file    将文本按每两行生成一个文件


split -b50 file    将文件以50个字节为一个文件进行分割


split -C50 file      在以文本内容记录完整性为前提下,进量保证以50字节为为一个文件                      个文件进行分割



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



十.join  ----用于实现将两个文件中具有相同域的记录选择出来的连接操作


选项
-a1或-a2  除了显示以共同域进行连接的结果外,-a1表示还显示第二个文件中没有共同域的记录
-i        比较域内容时,忽略大小写差异
-o        设置结果显示的格式
-t        改变域分隔符
-v1或-v2   与-a选项类似,但是不显示以共同域进行连接的结果
-1和-2    -1用于设置文件1用于链接的域,-2用于设置文件2用于连接的域


语法:join [选项] 文件1 文件2


1.-a和-v选项


例子
join -t:  file1 file2  只显示file1和file2中可以连接的行
join -t: -a1 file1 file2   除了显示可以连接的行,还显示file1的所有未连接的文件
join -t:  -a2 file1 file2   除了显示可以连接的行,还显示file2的所有未俩件的文件
join -t: -v1 file1 file2   只显示file1中未连接的行
join -t: -v2 file1 file2   只显示file2中未连接的行


2.-o选项  ---用于改变结果显示的格式


例子
join -t: -o11.1 2.2 .12 file1 file2
 显示的格式为依次显示第1个文件中的第一个域、第2个文件的第2个域、第1个文件的第2个域



3.-1和-2选项  用于设置文件所链接的域


例子
join -t: -i -1 3 -2 1 file1 file2
以文件1的第3域和文件2的第1域进行连接,并忽略大小写







++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



十一、tr (用于字符转换)
   tr [选项] 字符串1 字符串2 <filename
              
选项
 -c 选定字符串1中字符集的补集,即反选字符串1中的字符集
 -d 删除字符串1中出现的所有字符
 -s 删除所有重复出现的字符序列,只保留一个 



1.tr -d  字符 <filename  删除文本中的字符
例子
tr -d A-Z <filename  删除文本中所有的大写字母
tr -d "[\n]" <filename  删除文本中所有的换行符


tr支持的控制字符
\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


2.-s   --删除所有重复出现的字符序列,只保留一个
例子
tr -s "[\n]" <filename   将重复出现的换行符压缩成一个
tr -s "[a-z],[A-Z]" <filename   将所有重复字母压缩成一个



3.替换
 tr "[a-z]" "[A-Z]" <filename 将小写字符替换为大小字母
 tr "[:lower:]" "[:upper:]" < filename 字符集表示法



4.-c  ---选定字符串1中字符集的补集
tr -cs "[a-z][A-Z]" "{\012*} <filename
将不在“[a-z][A-Z]"字符集内的字符替换为换行符,并将重复的出现的换行符压缩为一个


tr "[o*5]" "*"<filename 将文本连续出现5次的o改为*字符



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


十二、sort


格式:sort [选项] [输入文件]


选项
-c         测试文件是否已经被排列
-k         指定排序的域
-m         合并两个已排序的文件
-n         更加数字大小进行排序
-o[输入文件]  将输出写到指定的文件,相当于将输出重定向到指定文件
-r         将排序结果逆向显示
-t         改变域分隔符
-u         去除结果中的重复行



1.-t选项   --用于设置分隔符
例子:
sort -t: -k3 filename  根据第三域对文本排序


2.-k选项   ---指定按某个域进行排序
例子
   sort -t: -k3 filename  根据第三域对filename排序(字符串方式排序)




3.-n选项   ---指定根据数字大小进行排序
例子:
   sort -t: -k3n filename  根据第三域的数字由小到大排序


4.-r选项     ---用于将排序结果逆向显示
例子:
    sort -t: -k3nr filename  将第三域按数字由大到小排序


5.-u选项    ---去除排序结果中的重复行


例子:
   sort -t: -u filename   利用-u去除文本中的重复行


6.-o选项   --将输出到屏幕的文件另存为
例子:
    sort -t: -k3n -o input file  将按要求排好序的文本input另存为file


     
7.-c选项     ---用于测试文件是否已经排好序
sort  -t: -c filename   测试filename是否按默认方式排序


sort -t: -k3n -c filename  测试filename是否按第三域的数值大小排序


8.-m选项  ---将两个排好序的文件合并成一个好、排好序的文件


sort -t: -m file1 file2  合并file1和file2


本文出自 “endmoon” 博客,请务必保留此出处http://endmoon.blog.51cto.com/10533729/1681700

shell脚本学习笔记之文本处理命令

标签:cut   uniq   paste   cat   more   head   

原文地址:http://endmoon.blog.51cto.com/10533729/1681700

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