zoukankan      html  css  js  c++  java
  • Linux三剑客grep、awk、sed

    何为Linux三剑客?

    1. 第一个剑客是 grep,grep 会根据正则表达式查找相关内容并打印对应的数据。
    2. 第二个剑客是 awk,awk 的名字来源于三个作者的名字简称,它可以根据定位到的数据行处理其中的分段。
    3. 第三个剑客是 sed,它是 stream editor 流式编辑器的简称,可以定位到数据行并对数据进行增删改查操作。
    4. 提到三剑客首先不得不提和三剑客组合的正则表达式了。

    正则表达式

    通配符 功能
    c* 将匹配 0 个(即空白)或多个字符 c(c 为任一字符)。
    . 将匹配任何一个字符,且只能是一个字符。
    [xyz] 匹配方括号中的任意一个字符。
    [^xyz] 匹配除方括号中字符外的所有字符。
    ^ 锁定行的开头。
    $ 锁定行的结尾。

    需要注意的是,在基本正则表达式中,如通配符 *、+、{、|、( 和 )等,已经失去了它们原本的含义,而若要恢复它们原本的含义,则要在之前添加反斜杠 ,如 *、+、{、|、( 和 )。

    Linux三剑客之Grep

    grep是Linux下通用的文本内容查找命令
    grep [选项] [匹配名] [路径]
    选项与参数:

    • -c :计算找到 '搜寻字符串' 的次数
    • -i :忽略大小写
    • -n :输出行号
    • -v :反向选择,亦即显示出没有'搜寻字符串' 内容的那一行。
    • --color=auto :可以将找到的关键词部分加上颜色显示。

    示例:

    grep root /etc/passwd # 将/etc/passwd,有出现root的行取出来 等同于cat /etc/passwd | grep root


    grep test aa bb cc #显示在aa,bb,cc文件中匹配test的行


    grep -v 'xxx' a.txt #指显示不包含xxx的行或文件


    grep -r print test/ #递归搜索test目录下包括print字符串的行


    grep -n '[set]' 1.sh #匹配[]内任意一个或多个字符串的行


    grep -n '[0-9]' 1.sh # 匹配有数字的行


    grep -n '^d' 1.sh #匹配d开头的行


    grep -n 'x$' 1.sh #匹配x结尾的行

    Linux三剑客之Awk

    AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
    之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
    语法:
    awk [options] 'script' var=value file(s)
    awk [options] -f scriptfile var=value file(s)
    常用参数:

    • -F,用于指定输入分隔符
    • -v,用于设置变量的值

    常用内置变量:

    • $0 : 表示整个输入记录,当前整行字符串.
    • $n : 表示当前输入记录的第 n 个域,这些域之间由 FS 分割,当前行的第n段。
    • NF: number of Field,当前行的字段的个数(即当前行被分割成了几列),字段数量。
    • NR: 行号,当前处理的文本行的行号。
    • FNR: 各文件分别计数的行号。
    • FS: 输入字段分隔符, 默认为空白字符。
    • OFS: 输出字段分隔符, 默认为空白字符。
    • FILENAME: 当前文件名。
    • RS: 输入记录分隔符(输入换行符), 指定输入时的换行符
    • ORS: 输出记录分隔符(输出换行符),输出时用指定符号代替换行符

    示例:

    awk -F: '{print $1}' /etc/passwd #通过:分割查看第一列数据

    awk -F: '{print$1,$3,$6}' /etc/passwd #输出字段1,3,6, 以制表符作为分隔符

    awk -F: '{print NF}' /etc/passwd # 显示每行有多少字段

    awk -F: 'NR==5{print}' /etc/passwd # 打印出/etc/passwd文件中的第5行

    awk -F: 'NR>2 && NR<6{print}' /etc/passwd #打印/etc/passwd文件中的3至5行

    awk -F: '/root/{print}' /etc/passwd # 打印出文件中含有root的行

    awk -F: '!/root/{print}' /etc/passwd #打印出文件中不含root的行

    awk -F: '/root|bash/{print}' /etc/passwd #打印文件含有root或者bash的行

    awk -F: '$1~/root/{print}' /etc/passwd #打印第一个字段是root的行

    cat /etc/passwd | awk 'NR>2 && NR>10' #查看test.txt文件内第2到第10行的内容

    ifconfig eth0 | grep inet | awk '{print$2}' | awk 'NR==1{print}' #查看linux eth0的ip地址

    Linux三剑客之sed

    sed的命令格式:sed [options] 'command' file(s)
    选项:
    ✓ -e :直接在命令行模式上进行sed动作编辑,此为默认选项;
    ✓ -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
    ✓ -i :直接修改文件内容;
    ✓ -n :只打印模式匹配的行

    动作说明:
    ✓ a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
    ✓ c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
    ✓ d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
    ✓ i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
    ✓ p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
    ✓ s :取代,可以直接进行取代!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦

    1、替换操作:s命令 ◆ sed 's/book/books/' file # 替换文本中的字符串
    ◆ sed -n 's/test/TEST/p' file #-n选项和p命令一起使用表示只打印那些发生替换的行

    ◆ sed -i 's/book/books/g' file # 直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books

    ◆ sed 's/book/books/g' file # 使用后缀 /g 标记会替换每一行中的所有匹

    2、删除操作:d命令
    ◆ sed '/^$/d' file #删除空白行

    ◆ sed '2d' file # 删除文件的第2行

    ◆ sed '2,$d' file # 删除文件的第2行到末尾所有行

    ◆ sed '$d' file # 删除文件最后一行

    ◆ sed '/^test/'d file # 删除文件中所有开头是test的

    3、其它
    ◆ sed -e '1,5d' -e 's/test/check/' file # 多点编辑,上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test
    ◆ sed -n '5,/^test/p' file #打印从第5行开始到第一个包含以test开始的行之间的所有行
    ◆ sed '/test/r file' filename # file里的内容被读进来,显示在与test匹配的行后面
    ◆ sed -n '/test/w file' example # 在example中所有包含test的行都被写入file里
    ◆ sed '/^test/a his is a test line' file # 将 this is a test line 追加到 以test 开头的行后面
    ◆ sed -i '2a his is a test line' test.conf # 在 test.conf 文件第2行之后插入 this is a test line
    ◆ sed '1,10y/abcde/ABCDE/' file # 把1~10行内所有abcde转变为大写

  • 相关阅读:
    台州 OJ 3847 Mowing the Lawn 线性DP 单调队列
    洛谷 OJ P1417 烹调方案 01背包
    快速幂取模
    台州 OJ 2649 More is better 并查集
    UVa 1640
    UVa 11971
    UVa 10900
    UVa 11346
    UVa 10288
    UVa 1639
  • 原文地址:https://www.cnblogs.com/huny/p/13664843.html
Copyright © 2011-2022 走看看