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:[[email protected] tmp]# uniq -c job
      2 ggg
      2 jjjjjjjjjjjj
 
  例子2:[[email protected] tmp]# uniq -c job
      2 ggg
      2 jjjjjjjjjjjj
      1 ggg
      1 jjj
 
  2.uniq -d   显示文本中重复的行(只显示一次)
  例子:       [[email protected] tmp]# uniq -d job
        ggg
        jjjjjjjjjjjj

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

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

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

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

1.paste file1 file2  将file1文本中的内容和file2文本中的内容显示为一个文本,同时将file1的内容作为第一个域字段,分隔符为tab(n个空格) 而file1作为第二个域字段显示,反之一样
 例子:  [[email protected] 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组合后的新文本
  例子:[[email protected] 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文本中本来不同行使用*分隔符区分,也就是说,原来的文本的每行内容之前用*分隔符作为域字段区分,而文本之间则以行区分。
  例子:[[email protected] tmp]# cat m n
a
b
c

o
p
q
  [[email protected] tmp]# paste -d: -s m n
a:b:c:
o:p:q

5.ls | paste -d“ ” - - -  
 例子:[[email protected] 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

时间: 2024-10-09 16:20:27

shell脚本学习笔记之文本处理命令的相关文章

shell脚本学习笔记系列--1

一.学好shell编程的知识储备 1.相关Linux系统命令应用: 2.Vi/vim 编辑器的熟练使用,相关客户端软件的设置: 3.基础的服务,系统服务ntp,crond,网络服务:nfs,rsync,inotify,sersync,ssh,lanmp等. 补充:清空日志的三种方法: 1)echo  " " > filename.log 2)>filename.log 3)cat  /dev/null > filename.log 注:工作中有的时候不能删除(日志)文

shell脚本学习笔记

1.判断符号:中括号[ ] [ ]进行数据的判断,例如我想知道HOME这个变量是否为空,[ -z "$HOME" ],或者两个字符串是否相等,[ "$HOME"  ==  "$MALI" ].由于中括号使用的地方有很多,所以在bash中作为判断式时,中括号的两端需要有空格来分隔.在使用中需要注意: 在中括号内的每个组件都需要有空格键来分隔 在中括号内的变量,最好以双引号括号起来,例如"$HOME" 在中括号内的常量,最好以单或

shell脚本学习笔记 (sed的高级用法----模式空间和保持空间)

前段时间在学习shell脚本,上次有提到sed的模式空间和保持空间概念,但是一直没有研究好,这两天研究了一下,所以将它发出来,不是很全面,仅仅供大家参考一下. 保持空间sed在正常情况下,将处理的行读入模式空间,脚本中的"sed command(sed命令)"就一条接着一条进行处理,直到脚本执行完毕.然后该行被输出,模式被清空:接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕. 模式空间可以比喻为一个生产线,而保持空间则可以被比喻为仓库,这个比喻希望可以帮助大家理解

Shell 脚本学习笔记十:Shell输入输出重定向

command > file       将输出重定向到 file. command < file       将输入重定向到 file. command >> file     将输出以追加的方式重定向到 file. n > file              将文件描述符为 n 的文件重定向到 file. n >> file             将文件描述符为 n 的文件以追加的方式重定向到 file. n >& m             

shell脚本学习笔记 (流编辑器sed)

sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不只支持正則表達式.它另一些比較厉害的功能. 我给出一个样例,大家看看有什么办法能够解决它吧. <html><head><title>Hello World</title> <body>Welcome to the world of regexp!&l

shell脚本学习笔记:通过shell实现linux用户管理和监控

学习shell做的第一个脚本,感谢云知梦李强强老师的shell编程教程 创建shell脚本文件: touch menu.sh touch index.sh touch welcome.sh 赋予脚本文件可执行权限: chmod a+x menu.sh index.sh welcome.sh menu.sh #!/bin/bash #menu.sh function menu(){ title="My Home" name="Randy" time=`date +%Y

shell 脚本学习笔记--函数

一.定义格式 [function] 函数名() { 命令表 } 二.调用方法 先定义,后使用,直接输入函数名,不需要圆括号() 三.函数参数传递方法 可以利用位置参数或者变量进行传递 #! /bin/bash# myfirst.sh testFunction() { echo "$1,$2" #位置参数传递参数 echo "$val1,$val2" #变量传递参数 } val1="test1" val2="test2" tes

Shell脚本学习笔记-函数

1.  基本的脚本函数 1.1 函数的定义 function name { commands } 或者 name() { commands } 1.2 简单示例 #!/bin/sh function Func01 { echo "This is function of Func01" } Func02() { echo "This is function of Func02" } Func01 Func02 运行结果: 1.3 函数返回值与退出码 #!/bin/sh

Shell脚本学习笔记-用户输入处理

1. 命令行参数 1.1 参数之间空格分隔,格式:$+position, e.g. $0, $1, $2,  其中$0表示脚本名字,超过10个参数时,e.g. 第10个参数用${10}表示: 1.2 简单示例: 1.3 通过建立软连接的方式,同一个脚本,根据不同脚本名字,运行不同脚本内容,e.g.: 2. 命令行参数变量的处理 2.1 通过条件判断,进行错误检测: 2.2 通过shift命令,进行移动位置参数: 2.3 命令行参数选项处理: 2.3.1 简单选项处理,e.g.: 2.3.2 分离