Shell脚本实战:解决常见问题与技巧

5星 · 超过95%的资源 需积分: 10 2 下载量 63 浏览量 更新于2024-09-13 收藏 117KB PDF 举报
"这篇文档汇总了关于Linux Shell脚本的各种常见问题及解决方案,包括查找特定文件、基于文件内容创建新文件、处理特定模式的数据以及监控日志文件等实用技巧。" 1. **查找并筛选文件内容** 题目中提到的问题是要找出所有以`.txt`结尾的文件,并打印出第一行不是`a`的所有文件。这个问题可以通过`find`命令配合`xargs`和`awk`来解决。`find`用于查找指定目录下的所有`.txt`文件,`xargs`将找到的文件名传递给`awk`,`awk`则检查每一行的第一行(NR==1),如果第一行内容不等于`a`,则打印文件名。命令如下: ```bash find / -name "*.txt" | xargs -n1 awk 'NR==1 && $0!="a"{print FILENAME}' ``` 2. **基于字段创建文件并填充内容** 这个问题涉及到从文件中读取每一行,然后根据第一个字段(以`.`分隔前的部分)创建新的文件,并将原始行的其余部分追加到对应文件中。可以使用`while read`循环配合参数替换实现。示例脚本如下: ```bash while read line; do file="${line%.*}" echo "${line#*.}" >> "$file" done < /root/data ``` 这会根据每行的前缀创建新文件,并将剩下的内容追加进去。 3. **处理特定模式的数据** 此问题需要在文本中查找特定模式`Completed in`,并根据其后的数值进行判断。如果数值大于20,则打印从上一个`Completed in`到当前`Completed in`之间的所有行。这可以通过`awk`实现,使用数组存储每行并进行检查。示例脚本如下: ```awk { arr[NR] = $0 } $0 ~ /Completed/ { if ($3 > 20) { for (i in arr) print arr[i] delete arr } else { delete arr } } ``` 这段代码会按行存储数据,遇到`Completed in`且数值大于20时,打印数组中的所有行并清空数组。 4. **监控日志文件并触发邮件通知** 最后一个问题是要监控日志文件 `/var/log/a.log`,如果超过2分钟没有新的日志条目,就发送邮件通知。这可以通过`bash`脚本来完成,利用`tail -n +1`获取最新的日志行,对比之前保存的行数来判断是否有新增。示例脚本如下: ```bash #!/bin/bash LOGFILE="/var/log/a.log" STARTNUM=$(wc -l "$LOGFILE") OLDSTARTNUM=$STARTNUM while true; do sleep 120 # 检查间隔2分钟 CURRENTNUM=$(wc -l "$LOGFILE") if [ $CURRENTNUM -eq $OLDSTARTNUM ]; then echo "No new log entries for over 2 minutes, sending email..." | mail -s "Log Alert" admin@localhost.localdomain fi OLDSTARTNUM=$CURRENTNUM done ``` 脚本会每2分钟检查一次日志文件,如果行数没有增加,就发送邮件报警。 这些示例展示了Shell脚本在处理文件操作、文本过滤、数据分析以及系统监控等任务上的灵活性和实用性。通过不断练习和学习,你可以掌握更多高级技巧,更好地应对日常的自动化需求。