前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >精简运维流程:grep、awk、sed三剑客的实用脚本

精简运维流程:grep、awk、sed三剑客的实用脚本

作者头像
希里安
发布2024-01-22 14:27:04
1980
发布2024-01-22 14:27:04
举报
文章被收录于专栏:希里安希里安

近日见闻

  1. TIOBE 宣布 2023 年度编程语言花落 C#,这是 C# 在 TIOBE 指数历史上首次荣获年度编程语言的奖项。--tiobe
  2. 中国电信星辰 AI 大模型开源,仓库地址 https://gitee.com/Tele-AI/tele-chat
  3. 中国信息通信研究院(简称 “中国信通院”)近日发布了《全球数字经济白皮书(2023 年)》, 截至 2023 年三季度,全球人工智能企业有 29542 家,中美人工智能企业数占全球总数的近一半,美国有 9914 家 (占比为 34%),中国有 4469 家 (占比为 15%)。--oschina
  4. 摘抄
代码语言:javascript
复制
当你可以和不确定性安然共处时,

无限的可能性就在生命中展开了。

——艾克哈特·托尔《新世界》

Linux文本操作基础复习

以下这些操作不用刻意去背或记,只要多加练习,自然而然就会用。我这里只挑常用的参数,更详细的参数,大家可以自行搜索查阅。

grep

grep 用于搜索文件中匹配特定模式的行。

  • -i:忽略大小写
  • -v:反转匹配,只显示不匹配的行
  • -c:计数匹配的行数
  • -n:显示匹配的行号
  • -r:递归搜索目录中的所有文件
  • -E:使用扩展正则表达式

常用示例

查找文件中包含"error"的行(不区分大小写):

代码语言:javascript
复制
grep -i "error" filename.txt

计算文件中不包含"warning"的行数:

代码语言:javascript
复制
grep -v -c "warning" filename.txt

在当前目录及子目录中递归搜索包含"main()"函数定义的C源代码文件:

代码语言:javascript
复制
grep -r "int main()" .

awk

awk 是一个功能强大的文本分析工具,主要用于数据抽取和报告生成。

  • -F:设置输入字段分隔符
  • -v:设置变量
  • NR:当前记录号(通常是行号)
  • NF:当前记录的字段数(列数)
  • $0:整个当前记录
  • 1, 2, ...:当前记录的第一列,第二列,等等

常用示例

打印文件第一列和第三列的内容:

代码语言:javascript
复制
awk '{print $1, $3}' filename.txt

将逗号作为字段分隔符,打印每一行的第二列:

代码语言:javascript
复制
awk -F, '{print $2}' filename.csv

计算文件中所有行的第一列之和:

代码语言:javascript
复制
awk '{sum += $1} END {print sum}' filename.txt

sed

sed 是一个流编辑器,用于执行基本的文本转换。

  • -i:直接修改文件内容(谨慎使用)
  • -e:允许多个编辑指令
  • s/regexp/replacement/:替换文本
  • d:删除
  • p:打印
  • g:全局替换标记

常用示例

将文件中的"oldtext"替换为"newtext":

代码语言:javascript
复制
sed 's/oldtext/newtext/' filename.txt

删除文件中所有空白行:

代码语言:javascript
复制
sed '/^$/d' filename.txt

将文件中所有的"foo"替换成"bar"并直接修改文件(谨慎使用):

代码语言:javascript
复制
sed -i 's/foo/bar/g' filename.txt

自动化进阶操作

熟能生巧,经常使用并且总结为自动化脚本一定可以事半功倍。

grep

grep 可以使用强大的正则表达式来进行模式匹配。

  • -o:仅输出文件中匹配到的部分。
  • -A n:打印匹配行及其后n行。
  • -B n:打印匹配行及其前n行。
  • -C n:打印匹配行及其前后各n行。

自动化脚本示例

代码语言:javascript
复制
#!/bin/bash
# 搜索日志文件中包含 "ERROR" 的条目,并且输出错误及其前后两行的内容
grep -C 2 'ERROR' /var/log/application.log > error_context.log


# 检查系统是否存在未授权的SSH登录尝试
grep 'Failed password' /var/log/auth.log | grep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' > suspected_ips.txt

awk

awk 可以执行复杂的文本处理任务,比如条件语句、循环、数组等。

  • BEGIN:在处理任何输入行之前执行的操作。
  • END:在处理完所有输入行之后执行的操作。
  • /pattern/ {action}:对匹配模式的行执行操作。
  • length($0):返回整行的长度。

自动化脚本案例

代码语言:javascript
复制
#!/bin/bash
# 分析Web服务器的日志文件,输出访问最频繁的10个IP
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -10

sed

sed 可以进行复杂的文本编辑操作,如插入、追加、替换多行文本等。

  • n~m:每m行匹配一次,从第n行开始。
  • &:在替换字符串中引用匹配的部分。
  • -np 结合使用:仅打印那些发生替换的行。

自动化脚本案例

代码语言:javascript
复制
#!/bin/bash
# 批量修改配置文件,将所有的 "localhost" 替换为 "127.0.0.1" 并备份原文件
sed -i.bak 's/localhost/127.0.0.1/g' /etc/application/config.cfg

# 删除CSS文件中的所有注释
sed -i '/\/\*/,/\*\//d' style.css

文本处理常用脚本示例

1. 实时监控日志文件中的关键词并发送警告

代码语言:javascript
复制
#!/bin/bash
# 实时监控指定日志文件的更新,一旦出现关键词 "CRITICAL ERROR",就发送一封警告邮件

tail -Fn0 /var/log/application.log | \
while read line ; do
    echo "$line" | grep "CRITICAL ERROR" &> /dev/null
    if [ $? = 0 ]; then
        echo "$line" | mail -s "Critical Error Detected" admin@example.com
    fi
done

2. 检查并列出文件夹中的大文件

代码语言:javascript
复制
#!/bin/bash
# 列出当前目录及子目录下所有超过100MB的文件

find . -type f -size +100M -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

3. 分析访问日志并按页面视图排序

代码语言:javascript
复制
#!/bin/bash
# 分析Apache访问日志,按页面访问次数排序输出

awk '{print $7}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head -10

4. 批量更改文件的扩展名

代码语言:javascript
复制
#!/bin/bash
# 在特定目录下,将所有.txt文件更改为.md文件

for file in /path/to/directory/*.txt; do
    mv "$file" "${file%.txt}.md"
done

5. 提取日志文件中的IP地址并统计出现次数

代码语言:javascript
复制
#!/bin/bash
# 提取日志文件中的IP地址,并统计每个IP出现的次数,输出最常见的10个IP

grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -10

6. 自动处理并格式化新的日志条目

代码语言:javascript
复制
#!/bin/bash
# 监控日志文件的增长,并为新的日志条目添加时间戳和格式化输出

tail -Fn0 /var/log/application.log | \
while read line ; do
    echo "$(date "+%Y-%m-%d %H:%M:%S") - $line" >> formatted_application.log
done

运维工程师通常使用grepawksed等工具来快速解决日常任务,如日志分析、系统监控、自动化部署等。以下是一些包含grepawksed的shell脚本案例,这些案例反映了运维工程师的常见用途。

7. 监控HTTP状态码并记录异常

代码语言:javascript
复制
#!/bin/bash
# 监控web服务器的日志文件,记录所有非200状态码的HTTP请求

tail -Fn0 /var/log/httpd/access_log | while read line; do
    echo "$line" | grep -v '" 200 ' | awk '{print $9}' | while read status; do
        if [ "$status" != "200" ]; then
            echo "$line" | awk '{print $1, $9}' >> /var/log/httpd/error_requests.log
        fi
    done
done

8. 提取特定时间段的日志条目

代码语言:javascript
复制
#!/bin/bash
# 提取昨天的日志条目

log_file="/var/log/application.log"
start_time=$(date -d "yesterday 00:00" '+%b %_d %H:%M')
end_time=$(date -d "yesterday 23:59" '+%b %_d %H:%M')

awk -v start="$start_time" -v end="$end_time" \
'$0 ~ start, $0 ~ end' $log_file > /var/log/application_yesterday.log

9. 分析磁盘使用情况并发送报告

代码语言:javascript
复制
#!/bin/bash
# 分析磁盘使用情况,如果超出阈值则发送报告

disk_usage=$(df -h | awk '$NF=="/"{print $(NF-1)}')
max_usage=90%

if [ "${disk_usage%?}" -ge "${max_usage%?}" ]; then
    df -h | mail -s "Disk Usage Alert" admin@example.com
fi

10. 备份并替换配置文件中的指定内容

代码语言:javascript
复制
#!/bin/bash
# 备份配置文件,然后替换文件中的一些旧参数值

config_file="/etc/application/config.cfg"
backup_file="/etc/application/config.cfg.bak"

cp $config_file $backup_file
sed -i 's/old_parameter/new_parameter/g' $config_file

11. 过滤并统计特定日志模式的发生次数

代码语言:javascript
复制
#!/bin/bash
# 过滤日志文件中的错误模式,并统计它们的发生次数

log_file="/var/log/application.log"
pattern="ERROR"

grep -c $pattern $log_file

在使用这些脚本之前,应该测试和验证脚本的正确性,以避免在生产环境中出现问题。如果以上内容对你有用,别忘了收藏加关注哦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 希里安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 近日见闻
  • Linux文本操作基础复习
    • grep
      • awk
        • sed
        • 自动化进阶操作
          • grep
            • awk
              • sed
              • 文本处理常用脚本示例
                • 1. 实时监控日志文件中的关键词并发送警告
                  • 2. 检查并列出文件夹中的大文件
                    • 3. 分析访问日志并按页面视图排序
                      • 4. 批量更改文件的扩展名
                        • 5. 提取日志文件中的IP地址并统计出现次数
                          • 6. 自动处理并格式化新的日志条目
                            • 7. 监控HTTP状态码并记录异常
                              • 8. 提取特定时间段的日志条目
                                • 9. 分析磁盘使用情况并发送报告
                                  • 10. 备份并替换配置文件中的指定内容
                                    • 11. 过滤并统计特定日志模式的发生次数
                                    相关产品与服务
                                    Elasticsearch Service
                                    腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档