操作系统

当前位置:金沙棋牌 > 操作系统 > 文本处理工具集锦,linux查看目录下所有文件内容

文本处理工具集锦,linux查看目录下所有文件内容

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-29 12:41

1. tr 按列替换

  • echo "{123}" | tr -d '{}' 删除输入中的 "{" 和 "}"

  • cat testfile |tr a-z A-Z 将文件testfile中的小写字母全部转换成大写字母

转自:

linux查看目录下所有文件内容中是否包含某个字符串,linux字符串

来源:

查找目录下的所有文件中是否含有某个字符串
find .|xargs grep -ri “IBM”
查找目录下的所有文件中是否含有某个字符串,并且只打印出文件名
find .|xargs grep -ri “IBM” -l
1.正则表达式
(1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/、*、?等)组成。
(2)基本元字符集及其含义
^ :只匹配行首。 如^a 匹配以a开头的行abc,a2e,a12,aaa,……
:只匹配行尾。   如^a 匹配以a结尾的行bca,12a,aaa,…….   
      * :匹配0个或多个此单字符。 如(a)* 匹配 空,a,aa,aaa,….   
      [] :只匹配[]内字符。可以是一个单字符,也可以是字符序列,用”,”将里面要匹配的不同字符串分开。也可以使用-来表示[]内字符序列的范围,如[1-5]表示[12345]   
       :只用来屏蔽一个元字符的特殊含义。 如*,’,”,|,+,^,. 等   
      .:(点)只匹配任意单字符。   
      pattern{n}:只用来匹配前面pattern出现的次数.n为次数。如a{2}匹配aa.   
      pattern{n,}:含义同上,但次数最少为n.如a{2,}匹配aa,aaa,aaaa,…..   
      pattern{n,m}:含义同上,但次数在n和m之间。如a{2,4}匹配aa,aaa,aaaa三个   
  (3)举例说明:   
      ^ :匹配空行
^.$ :匹配包含一个字符的行
*.pas :匹配以*.pas结尾的所有字符或文件
[0123456789]或[0-9] :假定要匹配任意一个数字
[a-z] :任意小写字母
[A-Za-z] :任意大小写字母
[S,s] :匹配大小写S
[0-9]{3}.[0-9]{3}.[0-9]{3}.[0-9]{3} :匹配IP地址 [0-9]{3}三个0-9组成的字符串;. :匹配点(注意这里点是特殊的字符,所以要用””来屏蔽其含义)
2.find介绍 (1)查找具有某些特征文件的命令,可遍历当前目录甚至于整个文件系统来查看某些文件或目录,其遍历大的文件系统时一般放在后台执行。
(2)find命令的一般形式
find pathname -options [-print -exec -ok]
-pathname :find命令所查找的目录路径。如用”.”来表示当前的目录,用/来表示系统根目录
-print :find命令将匹配的文件输出到标准输出
-exec: find命令对匹配的文件执行该参数所给出的shell命令,相应的命令形式为
‘command’{} ; (注意{}和之间的空格)
-ok 和 -exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
options有如下几种:
-name :按照文件名查找文件
-perm :按照文件权限来查找文件
-user :按照文件属主来查找文件
-group :按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。find命令还有-atime 和-ctime选项,但它们都和-mtime选项相似。
-size n[c]查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
-newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件
-depth 先查找指定目录有无匹配文件,若无则再在子目录中查找
-type 查找某一类型的文件,如
b :块设备文件
d:目录
e:字符设备文件
p;管道文件
l:符号链接文件
f:普通文件
(3)find命令举例
find -name “*.txt” -print 查找txt结尾的文件并输出到屏幕上
find /cmd “.sh” -print 查找/cmd目录下所有sh文件,并输出
find . -perm 755 -print 查找当前目录下权限为755的文件,并输出
find pwd -user root -print 查找当前目录下属主为root的文件,并输出
find ./ -group sunwill -print 查找当前目录下所属主是sunwill的文件
find /var -mtime -5 -print 查找/var目录下更改时间为5天内的所有文件
find /var -mtime +5 -print 查找/var目录下更改时间为5天以前的所有文件
find /var -newer “myfile1” ! -newer “myfile2” -print 查找/var目录下比myfile1新,但是比myfile2旧的所有文件。
find /var -type d -print 查找/var目录下所有目录
find /var -type l -print 查找/var目录下所有的符号链接文件。
find . -size +1000000c -print 查找当前目录下大于1000000字节的文件
find / -name “con.file” -depth -print 查找根目录下有无”con.file”,若无则在其子目录中查找
find . -type f -exec ls -l {} ; 查找当前目录下是否有普通文件,若有则执行ls -l
(4)xargs命令
在 使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec。不幸的是,有些系统对能够传递给exec的命 令长度有限制,这样find命令运行几分钟之后就算出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs的用处所在,特别是与 find命令一起使用,exec会发起多个进程,而xargs会多个,只有一个
find ./ -perm -7 -print | xargs chmod o-w 查找权限为7的文件并传递给chmod处理
3.grep介绍 (1)grep 的一般格式为 grep [options] 基本正则表达式 [文件]
字符串参数最好采用是双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串
-c:只输出匹配行的记数
-i:不区分大小写(只适用于单个字符)
-h:查询多个文件时不显示文件名
-H:只显示文件名
-l:查询多文件时只输出包含匹配字符的文件名
-n:只显示匹配行及其行号
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
(2)举例说明:
grep ^[^210] myfile 匹配myfile中以非2、1、0开头的行
grep “[5-8][6-9][0-3]” myfile 匹配myfile中第一位为5|6|7|8,第二位6|7|8|9,第三位为0|1|2|3的三个字符的行
grep “4{2,4}” myfile 匹配myfile中含有44,444或4444的行
grep “?” myfile匹配myfile中含有任意字符的行
(3)grep命令类名
[[:upper:]] 表示[A-Z]
[[:alnum:]] 表示[0-9a-zA-Z]
[[:lower:]] 表示[a-z]
[[:space:]] 表示空格或者tab键
[[:digit:]] 表示[0-9]
[[:alpha:]] 表示[a-zA-Z]
如:grep “5[[:digit:]][[:digit:]]” myfile 匹配myfile中含有5开头接下去两位都是数字的行。
4.awk介绍
可以从文件或字符串中基于指定规则浏览和抽取信息,是一种自解释的变成语言。
(1)awk命令行方式 awk [-F filed-spearator] ‘command’ input-files
awk脚本:所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它。awk脚本是由各种操作和模式组成。
模式部分决定动作语句何时触发及触发事件。(BEGIN,END)
动作对数据进行处理,放在{}内指明(print)
(2)分隔符、域和记录
awk执行时,其浏览域标记为1,1,2,…n.这种方法成为域标识。n.。0为所有域。
(3)举例说明:
awk ‘{print 0}' test.txt |tee test.out 输出test.txt中所有行0表示所有域
awk -F : ‘{print 1} test.txt |tee test.out’   同上。。只是分隔符为”:”   
      awk ‘BEGIN {print “IPDaten”}{print $1 "t" $4} END{print “end-of-report”}’ test.txt   
      开始时打印“IPDate”结束时打印“end-of-report”中间打印主体信息,比如总共匹配三条信息,则输出如下:  
IPDate   
1 first   
2 second   
3 third   
end-of-report   
  (4)匹配操作符 ~ 匹配,!~ 不匹配   
      cat test.txt |awk ‘0~/210.34.0.13/’ 匹配test.txt中为210.34.0.13的行
awk ‘0!~/210.34.0.13’ test.txt     匹配test.txt中不是210.34.0.13的行   
      awk ‘{if($1=="210.34.0.13") print $0}’ test.txt 匹配 test.txt中第一个域为210.34.0.13的行。  
5.sed介绍     sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕。   
    sed是一种很重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合。是一种非交互性文本流编辑。   
    (1)调用sed的三种方式   
      使用sed命令行格式为:sed [options] sed命令 输入文件   
      使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件   
      sed脚本文件[options] 输入文件   
      –不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。   
    (2)sed 命令的options如下   
        -n:不打印   
        -c:下一命令是编辑命令   
        -f:如果正在调用sed脚本文件   
    (3)sed在文件中查询文本的方式   
          –使用行号,可以是一个简单的数字,或是一个行号的范围   
          –使用正则表达式   
    (4)读取文本的方式   
          x       x为一行号   
          x,y       表示行号范围从x到y   
          /pattern/     查询包含模式的行   
          /pattern/pattern/ 查询包含两个模式的行   
          pattern/,x   在给定的行号上查询包含模式的行   
          x,/pattern/   通过行号和模式查询匹配行   
          x,y!       查询不包含指定行号x和y的行   
      (5)基本sed编辑命令   
            p   打印匹配行   
            d   删除匹配行   
            =   显示文件行号   
            a   在定位行号后附加新文本信息   
            i   在定位行号后插入新文本信息   
            c   用新文本替换定位文本   
            s     使用替换模式替换相应模式   
            r     从另一个文件中读文件   
            w   写文本到一个文件   
            q     第一个模式匹配完成后推出或立即退出   
            l     显示与八禁止ASCII代码等价的控制字符   
            {}   在定位行执行的命令组   
            n     从另一个文件中读文本下一行,并附加在下一行   
            g     将模式2粘贴到/pattern n/   
            y     传送字符   
    (6)举例说明:   
          sed -n ‘2p’ test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息)   
          sed -n ‘1,4p’ test.txt 打印第一行到第四行的信息   
          sed -n ‘/los/p’ test.txt模式匹配los,并打印出来   
          sed -n ‘2,/los/p’ test.txt 从第二行开始。。知道匹配第一个los   
          sed -n ‘/^/p’ test.txt 匹配空行
sed -n -e ‘/^/p' -e '/^/=’ test.txt 打印空行及行号
sed -n ‘/good/amorning’ test.txt 在匹配到的good后面附加morning
sed -n ‘/good/imorning’ test.txt 在匹配到的good前面插入morning
sed -n ‘/good/cmorning’ test.txt 将匹配到的good替换成morning
sed ‘1,2d’ test.txt 删除第1和2行
sed ‘s/good/good morning/g’ test.txt 匹配good并替换成goodmorning
send ‘s/good/& hello /p’ test.txt 匹配到good就在其后面加上hello
send ‘s/good/ hello &/p’ test.txt 匹配到good就在其前面加上hello
6.合并与分割(sort,uniq,join,cut,paste,split) (1)sot命令
sort [options] files 许多不同的域按不同的列顺序排序
-c 测试文件是否已经排序
-m 合并两个排序文件
-u 删除所有同样行
-o 存储sort结果的输出文件名
-t 域分隔符,用非空格或tab开始排序
+n :n 为列号,使用此列号开始排序
-n 指定排序是域上的数字分类项
-r 比较求逆
sort -c test.txt 测试文件是否分类过
sort -u test.txt 排序并合并一样的行
sort -r test.txt 以相反的顺序排列
sort -t “/” +2 test.txt 以”/”分隔,第二个域开始分类
(2)uniq命令
uniq [options ] files 从一个文本文件中去除或禁止重复行
-u 只显示不重复行
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数
-f :n为数字,前n个域被忽略
uniq -f 2 test.txt 忽略前2个域
(3)join 命令
join [options] file1 file2 用来将来自两个分类文本文件的行连在一起
-an,n为一数字,用于连接时从文件n中显示不匹配行
-onm ,连接域,n为文件号,m为域号
-jnm,n为文件号,m为域号,使用其他域作连接域
-t ,域分隔符。用来设置非空格或tab键的域分隔符。
(4)split命令
split -output_file_size intput_filename output_filename
用来将大文件分割成小文件。
-b n,每个分割文件的大小n
-C n,每个分割文件一行最多n字节
-l n,每个分割文件的行数
-n,同-l n
split -10 test.txt 将test.txt分割成10行的小文件
(5)cut 命令
cut -c n1-n2 filename 显示每行从开头算起 n1 到 n2 的文字。
cut -c 3-5 test.txt 显示test.txt中每行从第3到第5个字符

2. cut : cut [-b] [file] 列切分

cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。

如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

  • echo "123,456" | cut -d "," -f 1 以","分隔截取输入中的每行的第一部分内容输出.

  • who | cut -b 3 以字节为分隔, 输出每行的第三个字节. -c 是以字符为分隔

  • count=$(echo -e "${line}" | cut -f 2) 其中,line中字符是以tab作为分隔符!

内容目录:

  • find 文件查找
  • grep 文本搜索
  • xargs 命令行参数转换
  • sort 排序
  • uniq 消除重复行
  • 用tr进行转换
  • cut 按列切分文本
  • paste 按列拼接文本
  • wc 统计行和字符的工具
  • sed 文本替换利器
  • awk 数据流处理工具
  • 迭代文件中的行、单词和字符

本文将介绍Linux下使用Shell处理文本时最常用的工具:
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk;
提供的例子和参数都是最常用和最为实用的;
我对shell脚本使用的原则是命令单行书写,尽量不要超过2行;
如果有更为复杂的任务需求,还是考虑python吧;

3. chown, chgrp, chmod 权限

sudo chgrp root * 修改当前目录下所有文件为root组

sudo chown root * 修改当前目录下所有文件的owner为root

sudo chmod 777 -R dir 递归修改dir的权限为777

sudo chmod 755 file.sh 修改file.sh为任何人可执行权限

find 文件查找

  • 查找txt和pdf文件

      find . ( -name "*.txt" -o -name "*.pdf" ) -print
    
  • 正则方式查找.txt和pdf

      find . -regex  ".*(.txt|.pdf)$"
    

    -iregex: 忽略大小写的正则

  • 否定参数
    查找所有非txt文本

       find . ! -name "*.txt" -print
    
  • 指定搜索深度
    打印出当前目录的文件(深度为1)

      find . -maxdepth 1 -type f  
    

4. sudo

  • sudo -l 查看当前用户运行命令权限

  • sudo -u <user> command 使用user用户执行命令command

定制搜索

  • 按类型搜索:

      find . -type d -print  //只列出所有目录
    

    -type f 文件 / l 符号链接

  • 按时间搜索:
    -atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)
    -mtime 修改时间 (内容被修改)
    -ctime 变化时间 (元数据或权限变化)
    最近7天被访问过的所有文件:

      find . -atime 7 -type f -print
    
  • 按大小搜索:
    w字 k M G
    寻找大于2k的文件

      find . -type f -size +2k
    

    按权限查找:

      find . -type f -perm 644 -print //找具有可执行权限的所有文件
    

    按用户查找:

      find . -type f -user weber -print// 找用户weber所拥有的文件
    

5. uniq 去重

uniq -c file 在每行的旁边增加重复的数量。

找到后的后续动作

  • 删除:
    删除当前目录下所有的swp文件:

      find . -type f -name "*.swp" -delete
    
  • 执行动作(强大的exec)

      find . -type f -user root -exec chown weber {} ; //将当前目录下的所有权变更为weber
    

    注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
    eg:将找到的文件全都copy到另一个目录:

      find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;
    
  • 结合多个命令
    tips: 如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可;

      -exec ./commands.sh {} ;
    

6. nl 输出前加行号

  • nl file在输出的内容前加行号

  • nl -b a file 遇到空行,也加行号。

  • nl -n rz -w 3 file 行号3位对其,前面补0.

-print的定界符

默认使用'n'作为文件的定界符;
-print0 使用''作为文件的定界符,这样就可以搜索包含空格的文件;

7. shuf 打乱文件顺序

  • shuf sort_file -o rsort_file

grep 文本搜索

grep match_patten file // 默认访问匹配行

  • 常用参数
    -o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
    -c 统计文件中包含文本的次数

      grep -c "text" filename
    

    -n 打印匹配的行号
    -i 搜索时忽略大小写
    -l 只打印文件名

  • 在多级目录中对文本递归搜索(程序员搜代码的最爱):

      grep "class" . -R -n
    
  • 匹配多个模式

      grep -e "class" -e "vitural" file
    
  • grep输出以作为结尾符的文件名:(-z)

      grep "test" file* -lZ| xargs -0 rm
    

8. split 将文件切分

  • split -5000 filesplit -l 5000 file 将file按行切分成多个文件, 文件最大行为5000

  • split -5000 -d file 以数字作为后缀,默认:xaa,xab,xac, 现在x00,x01,x02

  • split file.txt -b 10M 将文件file.txt平均切分成10M

xargs 命令行参数转换

xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find;

  • 将多行输出转化为单行输出
    cat file.txt| xargs
    n 是多行文本间的定界符

  • 将单行转化为多行输出
    cat single.txt | xargs -n 3
    -n:指定每行显示的字段数

合并文件

  • cat x* > file.txt 将以x开头的所有文件合并到file.txt`中

  • cat file1 file2 > file3 将file1和file2合并保存到file3中.

文件内容顺序, 按照file1+file2的顺序保存到file3

xargs参数说明

-d 定义定界符 (默认为空格 多行的定界符为 n)
-n 指定输出为多行
-I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
eg:

cat file.txt | xargs -I {} ./command.sh -p {} -1

-0:指定为输入定界符
eg:统计程序行数

find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l

模式切分csplit

将文本文件file以第 2 行为分界点切割成两份,命令: csplit testfile 2

sort 排序

字段说明:
-n 按数字进行排序 VS -d 按字典序进行排序
-r 逆序排序
-k N 指定按第N列排序
eg:

sort -nrk 1 data.txt
sort -bd data // 忽略像空格之类的前导空白字符

文件求交,差,补

cat a b | sort | uniq > c # c 是 a 并 b

cat a b | sort | uniq -d > c # c 是 a 交 b

cat a b b | sort | uniq -u > c # c 是 a - b

uniq 消除重复行

  • 消除重复行

      sort unsort.txt | uniq 
    
  • 统计各行在文件中出现的次数

      sort unsort.txt | uniq -c
    
  • 找出重复行

      sort unsort.txt | uniq -d
    

    可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数

9. sed按行操作文本(大文本操作)

大文本数据修改,编辑,保存,不能用编辑器打开,可以借助sed对大文件进行修改

sed编辑行以1为起始index!

用tr进行转换

  • 通用用法

      echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符
      cat text| tr 't' ' '  //制表符转空格
    
  • tr删除字符

      cat file | tr -d '0-9' // 删除所有数字
    

    -c 求补集

      cat file | tr -c '0-9' //获取文件中所有数字
      cat file | tr -d -c '0-9 n'  //删除非数字数据
    
  • tr压缩字符
    tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格

      cat file | tr -s ' '
    
  • 字符类
    tr中可用各种字符类:
    alnum:字母和数字
    alpha:字母
    digit:数字
    space:空白字符
    lower:小写
    upper:大写
    cntrl:控制(非可打印)字符
    print:可打印字符
    使用方法:tr [:class:] [:class:]

      eg: tr '[:lower:]' '[:upper:]'
    

详解

  • -e 多次编辑

nl file | sed -e '3,$d' -e 's/bash/blueshell/' 删除第三行到最后一行,然后将1-2行中匹配bash的字符串替换成blueshell字符串

sed -e 4anewLineContent file 在第四行后天添加一行内容newLineContent

  • -n 仅显示script处理后的结果。

nl /etc/passwd | sed -n '5,7p' 仅列出文件的5-7行。

nl /etc/passwd | sed -n '/root/p' 仅列出匹配root的行

  • -i 直接编辑源文件危险动作

sed -i 's/.$/!/g' file 将file的最后一行中的.替换成!

sed -i '$a # This is a test' file 在最后一行,再添加一行内容:# This is a test' file

nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 首先匹配所有bash行,然后执行{}里面的一组动作,替换bash为blueshell,p打印,q退出!

-e 接的动作:

  • a :新增, 在当前行的下一行添加,是新的一行

  • i :插入, 在当前行的上一行插入,是新的一行

  • c :取代

  • d :删除, 后面没有内容;

nl file | sed '2,5d' 删除第二到五行!

sed '2d' file 删除第二行

nl file | sed -n '/root/p' 删除所有行中包含root的行!

  • p :打印列。通常 p 与参数 sed -n 一起用

  • s :替换,/要被取代的字串/新的字串/g

cut 按列切分文本

  • 截取文件的第2列和第4列:

      cut -f2,4 filename
    
  • 去文件除第3列的所有列:

      cut -f3 --complement filename
    
  • -d 指定定界符:

      cat -f2 -d";" filename
    
  • cut 取的范围
    N- 第N个字段到结尾
    -M 第1个字段为M
    N-M N到M个字段

  • cut 取的单位
    -b 以字节为单位
    -c 以字符为单位
    -f 以字段为单位(使用定界符)
  • eg:

      cut -c1-5 file //打印第一到5个字符
      cut -c-2 file  //打印前2个字符
    

使用

  1. 查找行号 grep -n --color '您的司机账户已被冻结' outbox.csv

  2. 删除对应行号保存: sed -e 5d file1 > ./file2 删除第五行 并保存到当前目录下的file2文件中。

  3. 删除匹配项: cat file1 | sed '/hello/d' > ./file2 删除所有行中包含hello字符串的行保存。

nl file1 | sed '/hello/d' > ./file2 在每行内容前加一个行号,保存到文件中!

paste 按列拼接文本

将两个文本按列拼接到一起;

cat file1
1
2

cat file2
colin
book

paste file1 file2
1 colin
2 book

默认的定界符是制表符,可以用-d指明定界符
paste file1 file2 -d ","
1,colin
2,book

10. 只输出一行中匹配的字符串.

语法: grep -o 'regex'

  • less file* | grep type | grep -o 'user[.*]user_id' | grep -o '[.*]' | sort | uniqfile开头的所有文件中,每行包含type的字符串,提取字符串中以user[.*]user_id形式存在[]中的内容!

wc 统计行和字符的工具

wc -l file // 统计行数
wc -w file // 统计单词数
wc -c file // 统计字符数

sed 文本替换利器

  • 首处替换

      seg 's/text/replace_text/' file   //替换每一行的第一处匹配的text
    
  • 全局替换

       seg 's/text/replace_text/g' file
    

    默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:

      seg -i 's/text/repalce_text/g' file
    
  • 移除空白行:

      sed '/^$/d' file
    
  • 变量转换
    已匹配的字符串通过标记&来引用.

    echo this is en example | seg 's/w+/[&]/g'
    $>[this]  [is] [en] [example]
    
  • 子串匹配标记
    第一个匹配的括号内容使用标记 1 来引用

      sed 's/hello([0-9])/1/'
    
  • 双引号求值
    sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:

      sed 's/$var/HLLOE/'
    

    当使用双引号时,我们可以在sed样式和替换字符串中指定变量;

    eg:
    p=patten
    r=replaced
    echo "line con a patten" | sed "s/$p/$r/g"
    $>line con a replaced
    
  • 其它示例
    字符串插入字符:将文本中每行内容(PEKSHA) 转换为 PEK/SHA

      sed 's/^.{3}/&//g' file
    

awk 数据流处理工具

  • awk脚本结构
    awk ' BEGIN{ statements } statements2 END{ statements } '

  • 工作方式
    1.执行begin中语句块;
    2.从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;
    3.执行end语句块;

print 打印当前行

  • 使用不带参数的print时,会打印当前行;

      echo -e "line1nline2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
    
  • print 以逗号分割时,参数以空格定界;

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1, var2 , var3; }'
    $>v1 V2 v3
    
  • 使用-拼接符的方式(""作为拼接符);

    echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3"; 
    print var1"-"var2"-"var3; }'
    $>v1-V2-v3
    

特殊变量: NR NF $0 $1 $2

NR:表示记录数量,在执行过程中对应当前行号;
NF:表示字段数量,在执行过程总对应当前行的字段数;
$0:这个变量包含执行过程中当前行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;

echo -e "line1 f2 f3n line2 n line 3" | awk '{print NR":"$0"-"$1"-"$2}'
  • 打印每一行的第二和第三个字段:

      awk '{print $2, $3}' file
    
  • 统计文件的行数:

      awk ' END {print NR}' file
    
  • 累加每一行的第一个字段:

      echo -e "1n 2n 3n 4n" | awk 'BEGIN{num = 0 ;
      print "begin";} {sum += $1;} END {print "=="; print sum }'
    

传递外部变量

var=1000
echo | awk '{print vara}' vara=$var #  输入来自stdin
awk '{print vara}' vara=$var file # 输入来自文件

用样式对awk处理的行进行过滤

awk 'NR < 5' #行号小于5
awk 'NR==1,NR==4 {print}' file #行号等于1和4的打印出来
awk '/linux/' #包含linux文本的行(可以用正则表达式来指定,超级强大)
awk '!/linux/' #不包含linux文本的行

设置定界符

使用-F来设置定界符(默认为空格)
awk -F: '{print $NF}' /etc/passwd

读取命令输出

使用getline,将外部shell命令的输出读入到变量cmdout中;

echo | awk '{"grep root /etc/passwd" | getline cmdout; print cmdout }'

在awk中使用循环

for(i=0;i<10;i++){print $i;}
for(i in array){print array[i];}

eg:
以逆序的形式打印行:(tac命令的实现)

seq 9| 
awk '{lifo[NR] = $0; lno=NR} 
END{ for(;lno>-1;lno--){print lifo[lno];}
} '

awk实现head、tail命令

  • head:

      awk 'NR<=10{print}' filename
    
  • tail:

      awk '{buffer[NR%10] = $0;} END{for(i=0;i<11;i++){ 
      print buffer[i %10]} } ' filename
    

打印指定列

  • awk方式实现:

      ls -lrt | awk '{print $6}'
    
  • cut方式实现

      ls -lrt | cut -f6
    

打印指定文本区域

  • 确定行号

      seq 100| awk 'NR==4,NR==6{print}'
    
  • 确定文本
    打印处于start_pattern 和end_pattern之间的文本;

      awk '/start_pattern/, /end_pattern/' filename
    

    eg:

    seq 100 | awk '/13/,/15/'
    cat /etc/passwd| awk '/mai.*mail/,/news.*news/'
    

awk常用内建函数

index(string,search_string):返回search_string在string中出现的位置
sub(regex,replacement_str,string):将正则匹配到的第一处内容替换为replacement_str;
match(regex,string):检查正则表达式是否能够匹配字符串;
length(string):返回字符串长度

echo | awk '{"grep root /etc/passwd" | getline cmdout; print length(cmdout) }'

printf 类似c语言中的printf,对输出进行格式化
eg:

seq 10 | awk '{printf "->%4sn", $1}'

迭代文件中的行、单词和字符

1. 迭代文件中的每一行

  • while 循环法

    while read line;
    do
    echo $line;
    done < file.txt
    改成子shell:
    cat file.txt | (while read line;do echo $line;done)
    
  • awk法:
    cat file.txt| awk '{print}'

2.迭代一行中的每一个单词

for word in $line;
do 
echo $word;
done

3. 迭代每一个字符

${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)
${#word}:返回变量word的长度

for((i=0;i<${#word};i++))
do
echo ${word:i:1);
done

本文为《linux Shell脚本攻略》的读书笔记,文中主要内容和示例来自于
《linux Shell脚本攻略》;

Posted by: 大CC | 18NOV,2013
博客:blog.me115.com
微博:新浪微博

本文由金沙棋牌发布于操作系统,转载请注明出处:文本处理工具集锦,linux查看目录下所有文件内容

关键词: