【shell】速通shell脚本三大常用命令grep、sed和awk

目录

一、grep命令

1.1  基础语法

1.2  常用选项

1.3  基础示例

1.4  grep与正则表达式

1.5  小结

二、sed命令

2.1  基础语法

2.2  常用操作

2.3  复杂用法

2.4  小结

三、awk命令

3.1  基础语法

3.2  基础用法

3.2.1  基础示例

3.2.2  内置变量

3.2.3  使用模式

3.3  常用操作

3.4  BEGIN 和 END 块

3.5  多条件判断

3.6  处理多个文件

3.7  小结


一、grep命令

        grep 命令用于搜索文本文件中符合条件的字符串(或正则表达式)并输出相关行的命令,表示全局正则表达式打印,广泛用于查找文件中包含特定模式的行。

1.1  基础语法

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

        模式:你要查找的文本模式,支持正则表达式。
        文件:指定要搜索的文件。如果不指定文件,grep 会从标准输入(通常是键盘输入)读取数据。 

1.2  常用选项

-i忽略大小写。搜索时不区分大写和小写字母
-v反转匹配,显示不包含模式的行
-r/-R递归查找目录中的所有文件
-l只显示匹配模式的文件名,而不显示匹配的行
-n显示匹配行的行号
-c只显示匹配模式的行数,而不是匹配的行内容
-H显示匹配模式的文件名,即使只有一个文件时
-h不显示匹配模式的文件名(默认行为在多个文件时有效)
-o只显示匹配到的部分,而不是整行
-w匹配整个单词(即模式必须是独立的单词,而不是单词的一部分)
-x匹配整行
-e允许使用多个模式进行匹配
--color高亮显示匹配到的字符串(默认开启)
-F表示固定字符串匹配(即不使用正则表达式进行匹配)
-P使用 Perl 正则表达式进行匹配(需要支持 Perl 正则的实现)
-A显示匹配行之后的 N 行
-B显示匹配行之前的 N 行
-C显示匹配行的上下 N 行

1.3  基础示例

1、在文件中查找单个字符串:
        查找 file.txt 文件中包含字符串 hello 的行。

grep "hello" file.txt

2、查找包含特定单词的行(忽略大小写):
        查找 file.txt 中包含 hello 或 HELLO 的行。

grep -i "hello" file.txt

3、递归查找目录中的文件:
        查找 /home/user/docs 目录下所有 .txt 文件中包含 pattern 的行。

grep -r "pattern" /home/user/docs/*.txt

4、反向查找不包含某模式的行:
        查找 file.txt 中不包含 error 的行。

grep -v "error" file.txt

5、查找多个模式的文件:
        查找 file1.txt 和 file2.txt 中包含 pattern1 或 pattern2 的行。

grep -e "pattern1" -e "pattern2" file1.txt file2.txt

6、显示匹配的行并加上行号:
        查找 pattern 在 file.txt 中的行,并显示行号。

grep -n "pattern" file.txt

7、只显示匹配部分:
        查找 pattern 在 file.txt 中的匹配,并仅显示匹配到的部分。

grep -o "pattern" file.txt

8、显示上下文行:
        查找 pattern 并显示其前后 2 行内容。

grep -C 2 "pattern" file.txt

1.4  grep与正则表达式

        grep 支持正则表达式,允许你执行复杂的模式匹配。你可以使用元字符(如 .、*、[]、^ 等)来构建模式。例如:

.匹配任意单个字符
*匹配前一个字符零次或多次
^表示行的开始
$表示行的结束
[]表示字符类,匹配括号中的任意字符
|表示或操作

例如,查找 file.txt 中以 start 开头的行:

grep "^start" file.txt

查找 file.txt 中以 end 结尾的行:

grep "end$" file.txt

1.5  小结

        grep 是一个非常强大的文本搜索工具,支持多种选项和正则表达式,广泛用于日志分析、文本文件筛选等场景。通过理解其常用选项和正则表达式,你可以在不同的环境中高效地查找和分析文本。

二、sed命令

        sed(stream editor)是一个流编辑器,用于处理文本数据。可以对文本进行查找、替换、删除、插入等多种编辑操作。sed 以流的方式工作,能够逐行处理文件或标准输入中的数据。

2.1  基础语法

sed [选项] '操作' 文件...

        操作:sed 用来处理的编辑命令,如替换、删除、插入等。
        文件:指定要编辑的文件。如果不指定文件,sed 会从标准输入读取数据。 

2.2  常用操作

2.2.1  替换(s),sed 最常见的操作是替换字符串。基本语法如下:

sed 's/old_pattern/new_pattern/' file

        这将把每一行中第一个出现的 old_pattern 替换成 new_pattern。

        s:表示替换操作。
        old_pattern:要匹配的字符串或正则表达式。
        new_pattern:替换的内容。

1、g:全局替换,替换行中的所有匹配项,而不仅是第一个。

sed 's/old/new/g' file

2、n:只替换第 n 次匹配。

sed 's/old/new/2' file

示例:
        将 file.txt 中所有的 apple 替换为 orange

sed 's/apple/orange/g' file.txt

        将 file.txt 中第一个 apple 替换为 orange

sed 's/apple/orange/' file.txt

2.2.2  删除行(d)
        sed 可以删除文本中的某些行。删除操作的基本语法是:

sed 'nd' file

        n:表示要删除的行号,支持范围或正则表达式。
示例:
        删除 file.txt 中第 2 行:

sed '2d' file.txt

        删除 file.txt 中从第 2 行到第 4 行的内容:

sed '2,4d' file.txt

2.2.3  插入行(i)
        sed 可以在指定行的前面插入新行:

sed 'n i\text' file

        n:插入位置行号。
        text:要插入的文本内容。
示例:
        在 file.txt 的第 2 行前插入 This is a new line:

sed '2i\This is a new line' file.txt

2.2.4  追加行(a)
        sed 也可以在指定行之后追加新行:

sed 'n a\text' file

        n:插入位置行号,追加新行。
        text:要追加的文本。
示例:
        在 file.txt 的第 2 行后追加 This is an appended line:

sed '2a\This is an appended line' file.txt

2.2.5  替换并保存(-i)
        如果你希望直接修改文件而不是输出到标准输出,可以使用 -i 选项进行就地编辑:

sed -i 's/old/new/g' file.txt

        这将会把 file.txt 中的所有 old 替换为 new,并直接修改文件内容。

2.2.6  打印行(p)
        sed 也可以用于打印出特定的行。常用的方式是与 -n 选项结合使用,来禁止默认的输出,只显示符合条件的行。

sed -n 'np' file

        -n:禁止默认打印。

        np:打印第 n 行。
示例:
        只显示 file.txt 中的第 2 行:

sed -n '2p' file.txt

2.2.7  替换时保留原行内容(&)
        在替换过程中,&可以表示匹配的部分,这样可以在新内容中引用它。

sed 's/apple/& pie/' file.txt

        这会把 apple 替换为 apple pie。

2.2.8  使用正则表达式
        sed 支持使用正则表达式来进行模式匹配。例如:替换以 a 开头的单词:

sed 's/\ba\w*/fruit/' file.txt

        这里的 \b 是单词边界,\w* 匹配以 a 开头的单词。

2.3  复杂用法

2.3.1  多条操作
        sed 允许在一个命令中执行多个编辑操作,使用分号 ; 或者换行符来分隔:

sed 's/old/new/; s/another/replace/' file.txt

2.3.2  使用正则表达式模式进行操作
        sed 支持扩展正则表达式(ERE):

sed -E 's/(apple|banana)/fruit/' file.txt

        这里,-E 选项启用了扩展正则表达式,使得括号和 | 变得更加简便。

3.3.3  行范围操作
        sed 可以对指定行范围进行操作:

sed '2,4s/old/new/g' file.txt

        这将在 file.txt 中的第 2 到第 4 行进行替换。

3.3.4  使用 &引用匹配的文本
        在替换中,&可以引用匹配到的字符串:

sed 's/apple/& fruit/' file.txt

        这会将 apple 替换为 apple fruit

2.4  小结

        sed 是一个强大的文本处理工具,适用于处理各种流数据。它支持多种编辑操作,如替换、插入、删除等,且支持正则表达式和扩展正则表达式,可以方便地进行复杂的文本操作。

        使用 sed 时,可以结合不同的选项和操作来精确控制文本编辑过程。

三、awk命令

        awk 可以用来处理和分析文本文件,尤其适用于列和行的操作。awk 的核心特点是基于模式和动作进行文本的处理,支持复杂的文本分析和格式化输出。

3.1  基础语法

awk 'pattern { action }' file

        pattern: 用于匹配输入文本的模式。如果匹配成功,则执行随后的 action。

        action: 要执行的操作,通常用 {} 包括。没有指定 action 时,默认输出匹配的行。

        file: 输入的文件。如果没有指定文件,awk 会从标准输入中读取数据。

3.2  基础用法

3.2.1  基础示例

1、打印文件的每一行

awk '{ print }' filename

        这个命令会逐行输出文件内容,相当于 cat filename

2、打印文件的第一列

awk '{ print $1 }' filename

        这里 $1 是指第一列的内容,$2 代表第二列,依此类推。

3.2.2  内置变量

        awk 提供了一些内置变量,最常用的包括:

        $0: 当前行的所有内容(整个文本行)。

        $1, $2, ..., $n: 当前行的第 1 列、第 2 列,依此类推。

        NR: 当前记录的编号(即行号)。

        NF: 当前行的字段数(列数)。

        FS: 字段分隔符,默认是空格或制表符。

        OFS: 输出字段分隔符,默认是空格。

例如,打印文件的第 1 列和第 2 列:

awk '{ print $1, $2 }' filename

3.2.3  使用模式

1、基于条件的匹配:

awk '$1 == "John" { print $2 }' filename

        这个命令会检查文件每一行的第一列,如果等于 "John",则打印该行的第二列。

 2、正则表达式匹配:

awk '$1 ~ /pattern/ { print $0 }' filename

        匹配第一列内容包含 pattern 的行,并打印整个行。

3、数字条件:

awk '$3 > 100 { print $0 }' filename

        这个命令会打印第三列大于 100 的行。

3.3  常用操作

1、修改分隔符

        默认情况下,awk 会以空格和制表符分隔字段。如果希望使用其他分隔符,可以通过设置 FSOFS 来更改。

        FS: 输入字段分隔符。
        OFS: 输出字段分隔符。

awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2 }' filename

        这个命令将输入文件的分隔符设置为逗号(,),输出字段的分隔符设置为制表符(\t)。

2、计算和累加

        awk 非常擅长进行数学计算,例如对某一列的求和:

awk '{ sum += $2 } END { print sum }' filename

        这条命令会对文件中第二列的所有数值进行累加,并在文件处理结束后输出结果。

3、格式化输出

        你可以使用 printf 来实现格式化输出:

awk '{ printf "Name: %-10s Age: %-3s\n", $1, $2 }' filename

        这个命令会输出第一列和第二列的数据,且将第一列的长度设为 10,第二列的长度设为

3.4  BEGIN 和 END 块

        BEGIN: 在处理文件内容之前执行,用于初始化操作。
        END: 在处理完所有文件内容后执行,用于结束时的操作。

awk 'BEGIN { print "Start of file processing" } { print $1 } END { print "End of file processing" }' filename

        这个命令会在开始时打印“Start of file processing”,处理每一行时打印第一列,结束时打印“End of file processing”。

3.5  多条件判断

        你可以使用逻辑运算符进行更复杂的条件判断。

awk '$1 == "John" && $2 > 30 { print $0 }' filename

        这个命令会在第一列为 "John" 且第二列大于 30 时打印该行。

3.6  处理多个文件

        awk 可以同时处理多个文件,处理时会将文件内容合并为一个输入流:

awk '{ print $1 }' file1 file2

3.7  小结

        awk 是一个非常灵活且强大的文本处理工具,适用于各种文本和数据分析任务。
        通过模式匹配和动作执行,可以轻松完成各种复杂的文本处理操作。
        学会利用内置变量、条件判断和格式化输出,可以大大提高数据处理效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值