三剑客grep、sed、awk

一. grep

grep命令是一个Linux文本处理工具,它与egrep命令属于同一系列,这些命令都是用于对文件和文本执行重复搜索任务的工具。我们可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。grep是全局搜索正则表达式并打印出匹配的行,其抓取数据是贪婪模式,即不会漏掉过滤内容,但准确性会相对降低。

  1. cat test.txt | grep aaa 等效于 grep aaa test.txt

  2. 忽略大小写:-i,例如:cat test.txt | grep -i aaa

  3. 扩展正则表达式:-E,例如:grep -E "^ab|^da" grep.txt 匹配以ab或da开头的行

  4. 多条件

    1. 或:| ,例如:grep -E "^ab|^da" grep.txt 匹配以ab或da开头的行

    2. 与,多个grep,用管道|链接,例如:cat test.txt | grep ^d | grep d$ 匹配以d开头且以d结尾的行

    3. 非,见反向过滤

  5. 反向过滤:-v,例如:grep -v a test.txt 过滤文件中不包含a的行

  6. 举🌰

    1. grep ^aa. grep.txt 匹配以aa开头的行

    2. grep .aa$ grep.txt  匹配以aa结尾的行

    3. ls -ll | grep ^- 展示当前目录所有的文件

    4. cat grep.txt | grep d.d 匹配以d开头以d结尾且中间包含一个字符的行;cat grep.txt | grep -E d*d 匹配以d开头以d结尾且中间包含任意个字符的行;注意:当使用正则时,grep后需要添加-E

    5. cat grep.txt | grep -E da+d 匹配以d开头以d结尾且中间至少包含一个a

    6. 常见正则字符:

      1. 元字符

        代码

        说明

        .

        匹配除换行符以外的任意字符

        \w

        匹配字母或数字或下划线或汉字

        \s

        匹配任意的空白符

        \d

        匹配数字

        \b

        匹配单词的开始或结束

        ^

        匹配字符串的开始

        $

        匹配字符串的结束

         

      2. 重复

        代码

        说明

        *

        重复零次或更多次

        +

        重复一次或更多次

        ?

        重复零次或一次

        {n}

        重复n次

        {n,}

        重复n次或更多次

        {n,m}

        重复n到m次

         

 

二. sed

sed 全名叫 stream editor即流编辑器,与 vim 的交互式编辑方式截然不同,作为一种非交互式编辑器,sed使用预先设定好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。其功能十分强大,加上正则表达式的支持,可以进行大量的复杂文本的编辑操作。

格式:sed 参数 命令 处理对象

  1. 显示:p,注意:不加-n参数时不仅显示文件的指定行,还会显示其他所有的行,-n参数只显示文件的指定行;例如:

    1. sed -n 5p test.txt ##显示第5行

    2. sed -n 3,5p test.txt ##显示第3行到第5行

    3. sed -n "3p;5p" test.txt ##显示第3行和第5行

    4. sed -n '5,$p' test.txt ##显示第5行到最后一行

    5. sed -n '/^#/p' test.txt ##显示以#开头的行

  2. 删除:d,不会修改目标文件,只是将修改后的内容打印出来;例如:

    1. sed 5d test.txt ##删除第5行

    2. sed '/^#/d' test.txt ##把以#开头的行删除

    3. sed '/^UUID/!d' test.txt ##删除不是以UUID开头的所有行

    4. sed '5,$d' test.txt ##删除第5行到最后一行

  3. 添加:a,命令:sed "$line a\\(多加一个\,防止后面的$value被转义)$value" $file,不会改变文件自身;例如:

    1. sed "2 a\\xxx" test.txt 表示在test.txt第二行插入xxx

  4. 插入:i,不改变文件自身

    1. sed '3i heihei' test.txt ,在文件第三行插入heihei,并打印

  5. 替换:c,不会改变文件自身;例如:

    1. sed '/^#/c hello world' fstab ##将所有以#开头的行替换为指定字符串

    2. sed '5chello world' westos ##将第5行替换为指定字符串

  6. 写入文件:w

    1. sed '/^a/w test1.txt' test.txt 把test.txt文件中a开头的行写入test1.txt文件中;等同于显示+重定向:sed -n '/^a/p' test.txt > test1.txt

  7. 整合文件:r,结合i参数,才会修改test.txt文件,如果不加i,test.txt文件不会被修改

    1. sed '4r test1.txt' -i test.txt 将test1.txt文件内容整合到test.txt文件的第四行之后

 

三. awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

格式:awk -F 分隔符 BEGIN{}{}END{} filename

表达式

含义

test

#test变量值

"test"

test字符串

/条件1|条件2/

#条件1或者条件2

/条件1/||/条件2/

#条件1或者条件2

/条件1/&&/条件2/

#条件1且条件2

$0

#所有的列

$1

#第一列

$2

#第二列

$3

#第三列

  1. 打印指定列

    1. awk -F , 'BEGIN{print "begin"}{print $1}END{print "end"}' test.txt

    2. 解释:以逗号(,)为分隔符,打印test.txt的第一列数据,并在开头和结尾分别打印begin和end,注意命令行中begin和end需要添加双引号,否则会被当做变量处理

  2. 统计文件行数

    1. awk -F , 'BEGIN{N=0}{N++}END{print N}' test.txt

    2. 解释:统计test.txt文件行数,分隔符位置用逗号或分号等其他符号都不影响,等效于:cat test.txt | wc -l

  3. 以逗号为分隔符,打印第一列

    1. awk -F , '{print $1}' test.txt

posted @ 2023-03-20 00:05  Katsu  阅读(63)  评论(0编辑  收藏  举报