科普文:Shell编程三剑客:grep+sed+awk
创始人
2024-09-25 15:24:40
0

        shell三剑客是grep、sed和awk三个工具的简称,因功能强大,使用方便且使用频率高,因此被戏称为三剑客,熟练使用这三个工具可以极大地提升运维效率。

三剑客的特点:

命令

特点

使用场景

grep

擅长查找过滤

快速查找过滤

sed

擅长取行和替换

需要快速进行替换/修改文件内容

awk

擅长取列、统计计算

文件取列、数据切片、对比/比较和统计

grep:

  grep 是 Linux 系统中一个非常强大的文本搜索工具,它能够快速地在文件中搜索指定的字符串或模式,并输出匹配的行。grep 是 "Global Regular Expression Print" 的缩写,意味着全局正则表达式打印。

        grep 可以匹配一个或多个正则表达式。 它快速、灵活,是文本搜索的标准工具。 grep 支持多种选项,如忽略大小写、递归搜索目录、使用正则表达式等。 常用于快速查找文件中包含特定文本的行。

语法结构

grep [OPTIONS] PATTERN [FILE...]

  • OPTIONS:可选的命令行选项。

  • PATTERN:要搜索的模式,可以是简单的字符串或复杂的正则表达式。

  • FILE:要搜索的文件或目录,如果不指定文件,默认为标准输入。

常用选项

  • -i:忽略大小写差异,使得搜索不区分大小写。

  • -v:显示不包含匹配文本的行。

  • -n:显示匹配行的行号。

  • -c:仅显示匹配行的数量,不显示行内容。

  • -r 或 -R:递归地在指定目录下的所有文件中搜索。

  • -e:允许同时搜索多个模式。

  • -l:仅显示包含匹配文本的文件名。

  • --color=auto:将匹配的文本以彩色显示,便于区分。

示例

创建测试用例文件

cat >> file.txt << EOF > this is my first file > print "hello world !" > list = {1,2,3,4,5,6,7,8,9,10} > print(list[1]) > print "HELLO WORLD !" > List={1,2,3,4,5,6,7,8} > x=List[1] > y=List[2] > EOF   cat file.txt this is my first file print "hello world !" list = {1,2,3,4,5,6,7,8,9,10} print(list[1]) print "HELLO WORLD !" List={1,2,3,4,5,6,7,8} x=List[1] y=List[2]

grep 搜索操作

搜索单个文件中的字符串:grep "hello" file.txt  搜索多个文件中的字符串:grep "hello" file1.txt file2.txt  同时搜索多个模式:grep -e "hello" -e "world" file.txt  显示匹配行号:grep -n "hello" file.txt  显示不匹配的行:grep -v "hello" file.txt  递归搜索目录中的字符串:grep -r "hello" directory/  只显示包含匹配文本的文件名:grep -l "hello" directory/  统计匹配的行数:grep -c "hello" file.txt  使用正则表达式搜索(假设 PATTERN 是一个正则表达式):grep -E "regexp" file.txt  高亮显示匹配的文本:grep --color=auto "hello" file.txt 

sed:

        sed(Stream Editor)是一个流编辑器,用于对文本数据进行过滤和转换。 它按照指定的模式执行编辑命令,如插入、删除、替换和转换。 sed 脚本可以非常简洁,适合进行简单的文本替换和模式匹配。 常用于自动化文本编辑任务。

语法结构

sed [OPTIONS] 'COMMANDS' [FILE...]

  • OPTIONS:可选的命令行选项。

  • COMMANDS:要执行的 sed 命令序列,通常用单引号括起来。

  • FILE:要处理的文件或文件列表,如果不指定,sed 会从标准输入读取。

常用命令

  • s:替换指定模式。

  • d:删除指定行。

  • i:在指定行前插入文本。

  • c:替换指定行。

  • y:字符转换。

  • p:打印行。

  • a:在指定行后追加文本。

  • q:退出 sed

选项

  • -i:直接修改文件,而不是输出到标准输出。

  • -n:仅打印经过 sed 命令处理的行。

  • -e:执行一个 sed 命令脚本。

示例

替换文件中的指定字符串: sed 's/hello/world/' file.txt  删除文件中的指定行: sed '3d' file.txt  在文件中指定行后插入指定字符串: sed '2i\hello world' file.txt  替换文件中指定行的内容: sed '3c\hello world' file.txt  在文件中指定行后追加文本: sed '2a\ This is a new line added after line 2\ ' file.txt  打印文件中匹配的行: sed -n '/world/p' file.txt  字符转换: sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file.txt  使用正则表达式进行替换: sed 's/[0-9]/& /g' file.txt  # 将数字后添加空格  使用模式匹配进行删除: sed '/^$/d' file.txt  # 删除空行  直接修改文件: sed -i 's/old/new/' file.txt  多命令执行: sed -e 's/old/new/' -e 's/yes/no/' file.txt  打印不匹配的行: sed -n '/old/!p' file.txt

awk:

        awk 的名称来源于其作者 Alfred V. Aho、Peter J. Weinberger 和 Brian W. Kernighan 的姓氏首字母。awk 是一个强大的文本处理工具,它不仅能够格式化和过滤文本数据,还能进行复杂的计算和数据处理,特别适合用来处理结构化数据,如表格数据。 它能够读取文件,并对数据进行模式扫描和处理。 awk 支持复杂的条件语句、循环、数组等编程结构。 常用于数据的提取、排序、计算等。

语法结构

awk [OPTIONS] 'PROGRAM' [FILE...]

  • OPTIONS:可选的命令行选项。

  • PROGRAM:awk 程序,包含模式和要执行的动作,通常用单引号括起来。

  • FILE:要处理的文件或文件列表,如果不指定,awk 会从标准输入读取。

常用选项

  • -F:设置输入字段分隔符。

  • -v:向 awk 程序传递外部变量。

  • --field-separators:设置字段分隔符。

  • --record-separators:设置记录分隔符。

基本元素

  • PATTERN:可以是特定的文本、正则表达式或空(表示所有记录)。

  • ACTION:当模式匹配时执行的命令或代码块。

示例

打印文件中的所有行: awk '{print}' file.txt  打印文件中第二列的内容: awk '{print $2}' file.txt  计算文件中所有数字的总和: awk '{sum += $1} END {print sum}' file.txt  打印文件中包含指定字符串的行: awk '/hello/ {print}' file.txt  在文件中指定列后面添加指定字符串: awk '{$3 = $3 "hello"} {print}' file.txt  使用字段分隔符: awk -F":" '{print $1}' /etc/passwd  条件判断: awk '{if ($1 > 100) print $0}' file.txt  循环结构: awk '{for (i = 1; i <= NF; i++) print $i}' file.txt  格式化输出: awk '{printf "%-15s %-10s\n", $1, $2}' file.txt  使用外部变量: awk -v var="value" '{print var}' file.txt  多模式匹配: awk '/pattern1/,/pattern2/' file.txt  自定义函数: awk '{func()} {print} function func() {print "This is a custom function"}'  处理多个文件: awk '{...}' file1.txt file2.txt

三个工具的常用用法以及组合用法

          Input Data               │               ▼        +---------------------------------------------------+        |                                                   |        |    grep                                           |  -> 过滤行/查找模式        |  - Search using regex                             |        |  - Invert match (-v)                              |        |  - Count matches (-c)                             |        |  - Show line numbers (-n)                         |        |  - Recursive search (-r)                          |        |  - Extended regex (-E)                            |        |  - File pattern exclusion (--exclude)             |        |  - Color matched output (--color)                 |        |                                                   |        +---------------------------------------------------+               │               ▼        +---------------------------------------------------+        |                                                   |        |    sed                                            |  -> 文本替换/编辑        |  - Replace text (s/old/new/g)                     |        |  - Delete lines (d)                               |        |  - Insert lines (i)                               |        |  - Append lines (a)                               |        |  - Modify in-place (-i)                           |        |  - Multiline operations (N, D, P)                 |        |  - Back references (\1, \2...)                    |        |  - Conditional execution (/pattern/ cmd)          |        |  - Case insensitive match (I)                     |        |                                                   |        +---------------------------------------------------+               │               ▼        +---------------------------------------------------+        |                                                   |        |    awk                                            |  -> 文本分析/格式化输出        |  - Parse fields ($1, $2, ...)                     |        |  - Pattern-action pairs                           |        |  - Built-in functions (length, substr, split...)  |        |  - Conditional patterns (BEGIN, END)              |        |  - Arithmetic ops (+, -, *, /)                    |        |  - String concatenation                           |        |  - User-defined functions                         |        |  - Associative arrays                             |        |  - Built-in variables (NF, NR, FS...)             |        |                                                   |        +---------------------------------------------------+               │               ▼           Output Data

示例

1. 过滤并格式化日志行: 假设我们想从一堆日志中找出包含 "ERROR" 或 "WARNING" 的行,并且只获取这些行的日期和消息内容,同时为其加上一个前缀。

   grep -E "ERROR|WARNING" log.txt | sed 's/\(\[.*\]\).*/\1/' | awk '{ print "Log Alert: " $0 }'
  • grep -E "ERROR|WARNING" log.txt: 使用扩展正则表达式搜索包含 "ERROR" 或 "WARNING" 的行。
  • sed 's/\(\[.*\]\).*/\1/': 使用捕获组捕获日期格式(例如:[2023-01-01 12:00:00]),并替换整行为该日期。
  • awk '{ print "Log Alert: " $0 }': 在每一行前加上 "Log Alert: "。

2. 提取特定范围的日志: 提取在两个时间戳之间的所有日志,并从中删除所有的DEBUG行,然后格式化输出。

   sed -n '/2023-01-01 00:00:00/,/2023-01-01 23:59:59/p' log.txt | grep -v "DEBUG" | awk '{ $1=""; $2=""; print $0 }'

sed -n '/2023-01-01 00:00:00/,/2023-01-01 23:59:59/p' log.txt: 提取日志中指定日期范围内的行。

  • grep -v "DEBUG": 排除包含 "DEBUG" 的行。
  • awk '{ $1=""; $2=""; print $0 }': 删除每一行的前两个字段。

3. 统计每种日志级别的数量: 提取所有的日志级别,并计算它们出现的次数。

  grep -oE "(ERROR|WARNING|INFO|DEBUG)" log.txt | sed 's/DEBUG/DEBG/' | awk '{count[$0]++} END { for (i in count) print i ": " count[i] }'
  • grep -oE "(ERROR|WARNING|INFO|DEBUG)" log.txt: 提取出每行的日志级别。
  • sed 's/DEBUG/DEBG/': 将 "DEBUG" 替换为 "DEBG"。
  • awk '{count[$0]++} END { for (i in count) print i ": " count[i] }': 使用数组统计每种日志级别的数量,并在结束时打印。

4. 从配置文件中提取和转换数据: 假设配置文件中有很多键值对,格式为 `key=value`,我们要找到所有以 "config" 开头的键,然后将其值修改为大写。

   grep "^config" config.txt | sed 's/\(config[^=]*\)=\(.*\)/\1=\U\2/' | awk -F '=' '{print $1 " is set to " $2}'
  • grep "^config" config.txt: 查找以 "config" 开头的行。
  • sed 's/\(config[^=]*\)=\(.*\)/\1=\U\2/': 捕获等号前后的内容,并将等号后的值转换为大写。
  • awk -F '=' '{print $1 " is set to " $2}': 打印格式化的输出。

5. 处理CSV文件: 假设你有一个CSV文件,你想找到所有名字中包含"John"的行,并将其年龄加10。

   grep ",John," data.csv | sed 's/\(,John,[^,]*,\)\([0-9]*\)/\1/' | awk -F ',' '{ $4 = $4 + 10; print $0 }'
  • grep ",John," data.csv: 查找名字为 "John" 的行。
  • sed 's/\(,John,[^,]*,\)\([0-9]*\)/\1/': 捕获John后的年龄字段。
  • awk -F ',' '{ $4 = $4 + 10; print $0 }': 将年龄字段增加10并打印。

6. 提取并转换XML数据: 如果你有一个XML文件,你想找到所有``标签,并更改其内容。

   grep ".*" data.xml | sed 's/\(.*\)<\/name>/\1/' | awk '{ print "Name tag contains: " $0 }'
  • grep ".*" data.xml: 查找包含  标签的行。
  • sed 's/\(.*\)<\/name>/\1/': 提取  标签内的内容。
  • awk '{ print "Name tag contains: " $0 }': 打印格式化的输出。

7. 网络分析: 假设你有一个包含网络请求的日志,你想找到所有的404错误,并从中提取请求的URL。

   grep " 404 " access.log | sed 's/.*GET \([^ ]*\) .*/\1/' | awk '{ print "Failed request to: " $0 }'
  • grep " 404 " access.log: 查找所有的404错误。
  • sed 's/.*GET \([^ ]*\) .*/\1/': 提取GET请求的URL。
  • awk '{ print "Failed request to: " $0 }': 打印格式化的输出。

相关内容

热门资讯

安卓系统为什么不封闭,揭秘安卓... 你有没有想过,为什么安卓系统那么开放,却不像苹果iOS那样封闭呢?这背后可是有着不少有趣的故事和原因...
安卓系统更新包多大,解析不同版... 你有没有发现,每次安卓系统更新,手机里都会多出那么几个G的文件?这可真是让人好奇,安卓系统更新包究竟...
安卓手机安装双系统吗,安卓手机... 你有没有想过,你的安卓手机是不是也能像电脑一样,装上两个系统,一个用来工作,一个用来娱乐?没错,这就...
oppo会升级安卓系统,畅享最... 你知道吗?最近有个大消息在手机圈里炸开了锅,那就是OPPO要升级安卓系统啦!这可不是什么小打小闹的更...
安卓系统上安装windows,... 你有没有想过,在安卓手机上安装Windows系统?听起来是不是有点不可思议?但你知道吗,这竟然是可能...
安卓系统怎么进运行框,安卓系统... 你有没有想过,你的安卓手机里有一个超级实用的功能,那就是运行框!它就像是一个小助手,帮你快速找到正在...
安卓系统电视无图像设置,安卓电... 你家的安卓系统电视突然没图像了?别急,让我来给你支个招,让你轻松解决这个问题!一、检查电源和连接线首...
安卓机建议升级系统吗,提升性能 你有没有发现,你的安卓手机最近有点儿慢吞吞的?是不是在犹豫要不要升级系统呢?别急,让我来给你好好分析...
升级不了安卓系统升级,探寻升级... 你有没有遇到过这种情况?手机里的安卓系统突然告诉你,它需要升级,但你左等右等,就是升不上去。这可真是...
备用安卓系统手机推荐,盘点热门... 你有没有想过,如果你的手机突然罢工了,你会怎么办?别担心,今天我就要给你安利几款备用安卓系统手机,让...
旧安卓系统ipad无法更新系统... 你有没有遇到过这种情况?你的旧安卓系统iPad突然告诉你,它无法更新系统了!是不是瞬间感觉心里有点小...
运行安卓6系统命令大全,全面掌... 你有没有想过,你的安卓手机里隐藏着无数强大的功能,只等着你去发现和探索呢?今天,就让我带你走进安卓6...
安卓系统简笔画教程下载,轻松绘... 你有没有想过,用简单的线条就能把复杂的安卓系统画出来?没错,就是那种一看就懂,一画就上手的感觉!今天...
华为如何鸿蒙转安卓系统,轻松实... 你知道吗?最近华为的大动作可是让整个科技圈都沸腾了!他们竟然把鸿蒙系统转到了安卓系统上,这可真是让人...
安卓10系统的问题,安卓10系... 你有没有发现,自从你的手机升级到安卓10系统后,好像有点不对劲呢?别急,让我来给你细细道来,看看安卓...
安卓系统苹果搞笑视频,苹果搞笑... 你知道吗?在互联网的世界里,搞笑视频可是个永恒的热门话题。尤其是那些结合了安卓系统和苹果手机的搞笑片...
卡片机改造安卓系统,探索改造之... 你有没有想过,那些曾经陪伴我们记录美好时光的卡片机,现在竟然也能焕发第二春呢?没错,就是那些小巧便携...
装安卓系统倒车出不来,智能科技... 你有没有遇到过这样的事情:手机装了个安卓系统,结果倒车的时候出不来啦?这可不是闹着玩的,简直让人抓狂...
定制安卓系统哪家好点儿,哪家服... 你有没有想过,手机系统就像是个人的衣服,每个人都需要找到最适合自己的那一款?今天,咱们就来聊聊定制安...
台电用回安卓系统吗,开启智能新... 最近有个话题在科技圈里炒得挺热的,那就是台电是不是要用回安卓系统了?你有没有想过,这个小小的决定背后...