Linux的文本内容检索-处理

Linux的文本内容检索-处理

制作人:全心全意

文本查找

  grep:搜索以文件输入(或者是标准输入,如果没有指定文件名,或者给出的文件名是-的话),寻找含有与给定的模式 PATTERN相匹配的内容的行。默认情况下, grep将把含有匹配内容的行打印出来。另外,也可以使用两个变种程序 egrep 和 fgrep 。 Egrep与 grep -E 相同。 Fgrep 与 grep -F 相同。

  用法:

    grep [选项] 模式 [文件...]

    grep [选项] [-e 模式 | -f 文件] [文件...]

      -i:忽略大小写

      --color:匹配到的字符串高亮显示

      -v:反向查找

      -o:仅显示匹配到的字符串本身,不显示行内没有匹配到的内容

      -E:使用扩展正则表达式,可使用egrep代替

      -A:指定显示匹配行后面多少行

      -B:指定显示匹配行前面多少行

      -C:指定显示匹配行前面和后面多少行

    模式:文本字符和正则表达式元字符组合而成

      注:正则的的特殊字符的含义

        .:匹配任意单个字符

        []:匹配指定范围内的单个字符

        字符集合:

          [:digit:]:数字

          [:lower:]:小写字母

          [:upper:]:大写字母

          [:punct:]:标点符号

          [:space:]:空白字符

          [:alpha:]:所有字符

          [:alnum:]:所有数字和字母

        [^]:匹配指定范围外的单个字符  

        *:表示匹配前面的字符任意次

        \?:表示匹配前面的字符0次或1次

        \{m,n\}:表示匹配前面的字符最少m次,最多n次

          \{1,\}:最少1次,多了不限

          \{0,3\}:最少0次,最多3次

        \<:其后面的任意字符必须作为单词首部出现(单词可以包含数字、字母)

        \>:其前面的任何字符必须作为单词尾部出现

          \<和\>都可以使用\b代替

        ^:行首

        $:行尾

        \(\):分组,例如\(ab\)*中将ab看做一个整体,多用于后向引用,后向引用使用\1、\2分别调用

 

#查找/etc/passwd文件中包含root的行
[root@localhost ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#查找/etc/inittab文件中以数字为结尾的行
[root@localhost ~]# grep '[[:digit:]]$' /etc/inittab 
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5

  

#分组的使用
#查找tt.txt文件中分组匹配到like,后面依旧是前面匹配到的内容
[root@localhost ~]# cat tt.txt 
The like is liker.
The like is lover.
[root@localhost ~]# grep '\(l..e\).*\1' tt.txt 
The like is liker.

  

流编辑器

  sed:用于过滤和转换文本的流编辑器

  用法:sed [选项]... {地址编辑命令(脚本)} [输入文件]...

    地址:

      起始行,结束行:1,100为第1到100行,$表示最后一行

      /模式(正则)/:匹配到的行

      /模式1/,/模式2/:第1次匹配模式1的行开始到第1次匹配模式2的行结束中间的所有行

      精确的行:5为第五行

      起始行,+N:从起始行开始向后N行

    编辑命令:

      d:删除符合条件的行

      p:显示符合条件的行,不使用-n,输出效果不好

      a \string:在指定的行后面增加新行,内容为string

      i \string:在指定的行前面增加新行,内容为string

      r FILE:将指定的文件的内容添加至符合条件行的后面

      w FILE:将指定范围内的内容另存至指定的文件中

      s/模式/string/:查找匹配模式的字符串并替换为指定的string,分隔符///可以使用其他的代替,例如###

        g:全局替换,默认只替换每行第一个

        i:忽略字符大小写

        &:在string中表示引用模式匹配的整个串

      y/字符集1/字符集2/:将字符集1中的字符替换为字符集2中对应的字符

    -n:静默模式,不再默认显示模式空间内容

    -i:直接修改原文件

    -e:同时指定多个地址编辑命令(格式为sed -e 脚本 -e 脚本 -e 脚本...)

    -f FILE:文件中为脚本命令,每一行为一个脚本,然后依次使用脚本对文件进行处理

    -r:使用扩展正则表达式,默认只支持基本正则表达式

    

   工作模式:逐行读取文本,将符合条件的文本行读取到内存空间(模式空间),而后使用编辑命令进行编辑,将结果显示到屏幕,默认对源文件不进行任何处理,处理的仅是模式空间读取过来的副本

 

#sed中替换可以使用分组
[root@localhost ~]# cat 5.txt 
I like you
I love you
#将l..e中的L换成大写
[root@localhost ~]# sed 's/l\(..e\)/L\1/' 5.txt 
I Like you
I Love you
#使用&进行引用整个串
[root@localhost ~]# sed  's/l..e/&r/' 5.txt 
I liker you
I lover you

  

[root@master tt]# cat 1.txt 
11
2
3
#使用字符转换1.txt中的字符
[root@master tt]# sed 'y/123/abc/' 1.txt 
aa
b
c

#使用w将指定范围内的内容写入文件
[root@master tt]# sed -n '1,2 w output' 1.txt 
[root@master tt]# cat output 
11
2

  

报告生成器

  awk:根据输入的信息,将所输入的信息格式化后进行输出。进行过一次更新,下载Linux下使用的是gawk。

  用法:

    awk [选项] ‘脚本’ 文件1,文件2...

    awk [选项] ‘模式 { 动作 }’ 文件1,文件2...

    -F:指定分隔符,默认使用空格作为分隔符,分隔后使用$1/$2/$3...调用,$0表示整行内容

    -v:定义awk变量

 

    模式:

      正则表达式,格式为/表达式/

[root@localhost ~]# awk -F: '/^r/{print $1}' /etc/passwd
root
rpc
rtkit

  

      表达式

#显示UID为0的用户名
[root@localhost ~]# awk -F: '$3 == 0 {print $1}' /etc/passwd
root

#第7个字段是否与模式匹配
[root@localhost ~]# awk -F: '$7~"bash$" {print $1}' /etc/passwd
root
zq

  

      指定范围,格式为模式1,模式2,模式1开始,模式2结束,模式建议使用表达式,测试时正则出现异常

      BEGIN/END:特殊模式,仅在awk命令执行前运行一次或结束前运行一次

[root@localhost ~]# awk 'BEGIN{print "开始"} {print $1,$4} END{ print "结束" }' 1.txt 
开始
My quanxinquanyi.
This text.
结束

  

      Empty(空模式):文件的每一行都做处理,模式什么也不写,直接写动作命令

[root@localhost ~]# awk '{print $1,$4}' 1.txt 
My quanxinquanyi.
This text.

  

    awk的内置变量

      FS:指定输入内容的分隔符,默认是空白字符,等同于选项-F

      RS:指定输入内容的换行符,默认是换行符

      OFS:指定输出内容的分隔符,默认是空白字符

      ORS:指定输出内容的换行符,默认是换行符

    awk的内置数据变量

      NR:相对于所有文件,awk命令所处理的行数

      NF:当前行的字段个数

      FNR:相对于当前处理的文件,awk命令所处理的行数,在指定多个文件时使用

    awk用户自定义变量

      gawk允许用户自定义自己的变量,以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,切不能以数字开头,gawk变量名称区分字符大小写。     

#用户自定义变量
[root@localhost ~]# awk 'BEGIN{ tt="test"; print tt}'
test
#使用选项用户自定义变量
[root@localhost ~]# awk -v tt="test" BEGIN'{print tt}'
test

  

    动作:

      print:输出内容,多个内容使用逗号分隔

      printf:自定义格式化输出内容,不会自动打印换行符

        用法:printf 格式 内容1,内容2...

        格式:格式之间不需要使用逗号进行分隔

          %c:显示字符的ASCII码

          %d,%i:十进制的整数

          %e,%E:科学计数法显示数值

          %f:显示浮点数

          %g,%G:以科学计数法的格式或浮点数的格式显示数值

          %s:显示字符串

          %u:无符号整数

          %%:显示%号自身

        修饰符:修饰符在格式中使用,例如(%-c、%+d)

          N:显示宽度,N为数字

          -:左对齐

          +:显示数值符号

#以10个字符作为宽度,默认右对齐
[root@localhost ~]# awk '{printf "%10s\n",$1}' 1.txt 
        My
      This
#以10个字符作为宽度,使用左对齐
[root@localhost ~]# awk '{printf "%10-s\n",$1}' 1.txt 
My        
This
#显示用户名和UID,用户名以20个字符显示并且左对齐,UID以5个字符显示,默认对齐
#格式之间无需使用分隔符
[root@localhost ~]# awk -F: '{printf "%-20s%5d\n",$1,$3}' /etc/passwd
root                    0
bin                     1
daemon                  2
......

      表达式

      控制语句:if、if-else、while、do-while、for、case、break和continue、next(提前结束此行的处理,进入下一行)

#判断用户名是否为root,root为管理员,否则为普通用户
[root@localhost ~]# awk -F: '{if ($1=="root") print $1,"管理员";else print $1,"普通用户"}' /etc/passwd
root 管理员
bin 普通用户
daemon 普通用户

  

#输出/etc/中字段的字符个数大于等于4的字段
[root@bogon ~]# awk -F: '{i=1;while(i<=NF){if (length($i) >= 4) print $i;i++}}' /etc/passwd
root
root

  

#统计默认shell分别使用的用户数
#awk中数组的下边可以使用字符串,不指定值默认为1,for循环中A的值为数组的下标
[root@bogon ~]# awk -F: '{shell[$NF]++}END{for(A in shell) {print A,shell[A]}}' /etc/passwd
/bin/sync 1
/bin/bash 2
/sbin/nologin 38
/sbin/halt 1
/sbin/shutdown 1

  

      输入输出语句

  

    awk的操作符

      算术操作符:

        **:次方

        *:乘法

        /:除法

        +:加法

        -:减法

        %:取余

      赋值操作符:

        =、+=、-=、*=、/=、%=、^=、**=、++、--

        注意:如果某模式为*号,此时使用/*/可能会有语法错误,应以/[*]/替代

      比较操作符:

        <、>、<=、>=、==、!=、

        x ~ y:x为字符串,y为模式,y模式可以匹配x为真

        x !~ y:y模式不可以匹配x为真

      逻辑关系符

        &&、||

      条件表达式

        三目运算符:条件?值1:值2

 

     awk的内置函数

      length([string]):返回string字符串中的字符个数

 

  cut:在文件的每一行中提取片断

  用法:cut [选项] [文件]

    -d,--delimiter:指定字段分隔符,默认使用TAB键作为分隔符(非空格)

    -f,--fields:指定输出的字段

[root@slave2 ~]# cat 1.txt 
123 345 456 567
#指定空格为分隔符,输出第2个字段
[root@slave2 ~]# cut -d" " -f2 1.txt 
345
#输出第1到3个字段
[root@slave2 ~]# cut -d" " -f1-3 1.txt 
123 345 456
#输出第1和第4个字段
[root@slave2 ~]# cut -d" " -f1,4 1.txt 
123 567

 

文本排序

  sort:对文本文件的行进行排序,默认根据升序进行排序,标准是首个字符在ASCII码表中的位置

  用法:sort [选项] [文件]

    -b:忽略行首的空格

    -n:按照数值大小排序,暗含-b

    -r:颠倒默认的排序,也就是降序

    -o:将排序结果输出到指定文件

    -t:指定字段分隔符

    -k:指定排序的字段

    -u:对排序后重复的行进行去重,对应命令uniq(必须排序后使用,去重时相同的行必须相邻

    -f:排序时忽略字符大小写

#根据UID对文件进行数值排序
[root@slave2 ~]# sort -n -t: -k3 /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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......

  

  uniq:删除排序文件中的重复行,与sort结合使用(必须排序后使用,去重时相同的行必须相邻

  用法:uniq [选项] 输入流

    -d:仅显示重复的行

    -D:显示所有重复的行

    -c:显示每一行重复的次数

[root@slave2 ~]# cat 1.txt 
123
234
123
456
456
#对重复的行进行去重
[root@slave2 ~]# sort -n 1.txt | uniq 
123
234
456
#统计排序后重复的行的次数
[root@slave2 ~]# sort -n 1.txt | uniq -c
      2 123
      1 234
      2 456
#仅显示重复的行
[root@slave2 ~]# sort -n 1.txt | uniq -d
123
456

  

文本统计

  wc:输出文件中的行数、单词数、字节数

  用法:wc [选项] [输入流]

    -l:显示行数

    -w:显示单词数

    -c:显示字节数

    -m:显示字符个数

    -L:显示最长的一行包含多少个字符

[root@slave2 ~]# wc /etc/passwd
  48   97 2519 /etc/passwd    
#48行    97的单词    2519个字节

  

字符处理

  tr:转换或删除字符(不能指定文件,可以使用输入重定向或管道)

  用法:tr [选项] 字符集1 [字符集2]

    -d:删除指定字符集中的字符

#对输入字符进行字符集对应替换
[root@slave2 ~]# echo "abc" | tr 'ab' 'AB'
ABc

  

[root@slave2 ~]# cat 1.txt 
acz
#将1.txt中小写字母全部转换为大写字母
[root@slave2 ~]# tr 'a-z' 'A-Z' < 1.txt 
ACZ
#删除输入中指定字符集中包含的字符
[root@slave2 ~]# tr -d 'c' < 1.txt 
az

  

文本合并

  paste:合并文件各行

  用法:paste [选项] [文件]...

    -d:指定分隔符

[root@slave1 zq20191114]# cat 1.txt 
1
2
3
[root@slave1 zq20191114]# cat a.txt 
a
b
c
#合并文件
[root@slave1 zq20191114]# paste 1.txt a.txt 
1	a
2	b
3	c
#合并文件,使用:作为分隔符
[root@slave1 zq20191114]# paste -d: 1.txt a.txt 
1:a
2:b
3:c

  

 

文件分割

  split:分割文件

  用法:split [选项] 文件 输出文件前缀

    -l:指定按行分割,不可对二进制文件使用

    -b:指定按文件大小分割

[root@slave1 tt]# cat 2.txt 
1
2
3
#指定按行分割文件,每一行分割为1个文件
[root@slave1 tt]# split -l 1 2.txt test_

[root@slave1 tt]# ll
总用量 16
-rw-r--r-- 1 root root 6 5月  21 17:35 2.txt
-rw-r--r-- 1 root root 2 5月  21 17:35 test_aa
-rw-r--r-- 1 root root 2 5月  21 17:35 test_ab
-rw-r--r-- 1 root root 2 5月  21 17:35 test_ac

#===========================

[root@master tt]# du -sh bash 
940K	bash
#指定按大小分割文件,每500K分割为1个文件
[root@master tt]# split -b 500K bash base_
[root@master tt]# ll
总用量 1880
-rw-r--r-- 1 root root 512000 5月  21 17:38 base_aa
-rw-r--r-- 1 root root 448392 5月  21 17:38 base_ab
-rwxr-xr-x 1 root root 960392 5月  21 17:38 bash

  

  

posted @ 2020-05-12 18:01  全心全意_运维  阅读(1908)  评论(0编辑  收藏  举报