#!/bin/bash # $1:文件夹名称 # $2:匹配字符串 # $3:可选参数,文件名不包含此参数 dir="/logs/$1" count=0 if [ ! -d "$dir" ]; then echo "目录 $dir 不存在" exit 1 fi while [ $count -lt 20 ] do if [ -z "$3" ]; then file=$(ls -rt "$dir" | grep "error" | tail -n $((20 - count)) | head -n 1) else file=$(ls -rt "$dir" | grep -v "$3" | tail -n $((20 - count)) | head -n 1 ) fi if [ -z "$file" ]; then echo "目录 $dir 中没有符合要求的文件" exit 1 fi matching_line=$( LC_ALL=C fgrep -n "$2" "$dir/$file" | tail -n 1) if [ -z "$matching_line" ]; then echo "文件 $file 中没有找到字符串 '$2'" count=$((count+1)) else line_number=$(echo "$matching_line" | cut -d ":" -f 1) echo "在文件 $file 中找到了字符串 '$2',位于第 $line_number 行:" if [ $((line_number - 100)) -lt 0 ]; then sed -n "1,$((line_number + 100))p" "$dir/$file" | awk '{printf("%s %s\n", NR, $0)}' echo "-----------------" command="sed -n \"1,$(( $line_number + 100 ))p\" \"$dir/$file\" | awk '{printf(\"%s %s\\n\", NR, \$0)}'" echo "$command" else sed -n "$((line_number - 100)),$((line_number + 100))p" "$dir/$file" | awk '{printf("%s %s\n", NR+'$(($line_number - 101))', $0)}' echo "-----------------" command="sed -n \"$(( $line_number - 100)),$(( $line_number + 100))p\" \"$dir/$file\" | awk '{printf(\"%s %s\\n\", NR+'$(($line_number - 101))', \$0)}'" echo "$command" fi echo "在文件 $file 中找到了字符串 '$2',位于第 $line_number 行:" break fi done if [ $count -eq 5 ]; then echo "在目录 $dir 中的多个文件中都没有找到字符串 '$2'" exit 1 fi