近日见闻
- TIOBE 宣布 2023 年度编程语言花落 C#,这是 C# 在 TIOBE 指数历史上首次荣获年度编程语言的奖项。--tiobe
- 中国电信星辰 AI 大模型开源,仓库地址
https://gitee.com/Tele-AI/tele-chat
- 中国信息通信研究院(简称 “中国信通院”)近日发布了《全球数字经济白皮书(2023 年)》, 截至 2023 年三季度,全球人工智能企业有 29542 家,中美人工智能企业数占全球总数的近一半,美国有 9914 家 (占比为 34%),中国有 4469 家 (占比为 15%)。--oschina
- 摘抄
当你可以和不确定性安然共处时,
无限的可能性就在生命中展开了。
——艾克哈特·托尔《新世界》
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行开始。&
:在替换字符串中引用匹配的部分。-n
与p
结合使用:仅打印那些发生替换的行。
自动化脚本案例:
代码语言: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
运维工程师通常使用grep
、awk
、sed
等工具来快速解决日常任务,如日志分析、系统监控、自动化部署等。以下是一些包含grep
、awk
、sed
的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
在使用这些脚本之前,应该测试和验证脚本的正确性,以避免在生产环境中出现问题。如果以上内容对你有用,别忘了收藏加关注哦!