Linux之三剑客

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之三剑客相关的知识,希望对你有一定的参考价值。

  • 正则表达式
  • grep
  • sed
  • awk

Linux中的文本处理工具,grep、sed、awk,也称之为三剑客,熟练的使用,对文本内容搜索、编辑等任务能够提升效率。grep/egrep/fgrep:文本过滤工具;sed:流编辑器;awk:文本报告生成器 ,格式化文本,3个开发者的名字缩写,也是一门完整的编程语言。

  • 正则表达式
    在学习之前先了解正则表达式的使用,由一类特殊字符及文本字符所编写的模式,常用来检查文件中是否含有特定的字符,以便对其进行编辑操作等。
    模式:通常 是由普通字符(数字、字母等)以及特殊字符(元字符)组成的字符串模式
    分类:基本正则表达式和扩展正则表达式
    • 基本正则表达式元字符:扩展正则表达式元字符
字符匹配 元字符 -基本 元字符 -扩展 作用
. . 匹配任意单个字符
[ ] [ ] 匹配指定范围内的任意单个字符 [:digit:]、[:upper:]、[:lower:]、[:alpha:]
[^] [^] 匹配指定范围外的任意单个字符 [:alnum:]、[:punct:]、[:space:] ...
匹配字数 用在指定的字符后表示其出现次数,默认为贪婪模式
* * 匹配前面字符任意次:0、1、n次
.* .* 匹配任意长度任意字符
? ? 匹配其前面字符0次或者1次
+ + 匹配其前面字符至少1次
{m} {m} 匹配其前面字符m次
{m,n} {m,n} 匹配其前面字符至少m次,至多n次
{m,} {m,} 匹配其前面字符至少m次
位置锚定
^ ^ 行首锚定
$ $行尾锚定
^pattern$ ^pattern$ 用于pattern 来匹配整行: ^$:空白行、^[[:space:]]*$:空行或包含空白字符的行
< , < , 词首锚定
>, B >, B 词尾锚定
<pattern> <pattern> 匹配完整单词
分组及引用 () 括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中 ,后向引用:1, 2, ...
或关系 1 a或者b

比如:A|apple:表示A或者apple;(A|a)pple:表示Apple和apple


  • grep使用:Global search Regular expression and Print out the line.
    grep|egrep [OPTIONS] PATTERN [FILE...]
    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
    options:
    --color=auto:对匹配到的文本着色后高亮显示,默认alias;
    -i:ignorecase,忽略字符大小写;
    -o:仅显示匹配到的字符串本身;
    -v, --invert-match:显示不能被模式匹配到的行;
    -E:支持使用扩展的正则表达式元字符;
    -q, --quiet, --silent:静默模式,即不输出任何信息;
    -n,--number 显示行数
    -r,--recursive 递归查找 grep -r money /etc  递归查找etc下的文件内包含money的文件,除了二进制文件
    -w,--word根据单子精确匹配查找
    [[email protected] scripts]# grep -v "/bin/bash$" /etc/passwd | head -3
    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
    [[email protected] scripts]# 
    找出ifconfig命令结果中的IP地址:
    ifconfig | grep "inet>" | tr -s " " | cut -d" " -f3
    ifconfig  eno16777736 | grep -w inet | tr -s " " | cut -d" " -f3    
    ifconfig  eno16777736 | grep ‘inet>‘ | sed ‘s/^.*inet[[:space:]]?//‘ | sed ‘s/netmask.*$//‘
    grep ‘inet addr‘ | sed ‘s/^.*addr://g‘ | sed ‘s/Bcast.*$//g‘
    ifconfig eno16777736 | awk -F‘[ :]+‘ ‘NR==2{print $3}‘
    ifconfig eno16777736 | awk  ‘NR==2{print $2}‘
    =====================================
    添加用户bash, testbash, basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
    [[email protected] scripts]#  grep  -E  "^([^:]+>).*1$"  /etc/passwd
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt            

  • sed :在使用中必须指定行号或正则表达式,sed 每次只从文件或标准输入中读取一行数据,将之拷贝到一个编辑缓冲区,然后对该行数据按指定命令进行处理,并将结果输出到屏幕(标准输出),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出;stream editor
    技术分享图片

    • 命令使用
      sed [OPTION]... ‘script‘ [file] ...
      script:文本的编辑范围及编辑命令
      常用选项:
      -n:不输出模式空间中的内容至屏幕即未编辑的
      -e script :多点编辑
      -f script-file:从脚本文件中读取内容进行编辑,可以实现批量修改
      -r, --regexp-extended:支持使用扩展正则表达式;
      -i[SUFFIX], --in-place[=SUFFIX]:直接在原文编辑

      eg:

    1.sed -e ‘s/root/centos/‘ -e ‘s/bash/nologin/‘ /ect/passwd
    2.  cat >>ss <<eof
             s/root/centos/p
             s/bash/nologin/  
             #sed -f ss  /etc/passwd    #-n 只显示匹配的
    3.在2的基础上修改为脚本
                        #!/bin/sed -f
                        ..
                        ]# ./sss /etc/passwd

    编辑范围:

    1.空地址:对全文进行处理;
    2.单地址:
                    #:指定行;
                    /pattern/:被此模式所匹配到的每一行;
    3. 地址范围
                    #,#:3,8  [3,8]
                    #,+#:
                    #,/pat1/
                    /pat1/,/pat2/ 
                    $:最后一行;
    4.步进:~ 
                    1~2:所有奇数行 
                    2~2:所有偶数行 

    编辑命令


 -  单位

以上是关于Linux之三剑客的主要内容,如果未能解决你的问题,请参考以下文章

Linux三剑客之grepegrep及正则表达式使用详解

Linux三剑客之grep

linux文本处理三剑客之grep

Linux文本处理三剑客之grep

Linux企业运维——Docker三剑客之Docker Machine

Linux文本三剑客之awk