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

2024-01-22 14:27:04 浏览数 (3)

近日见闻

  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

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

0 人点赞