如何向shell

时间:2015-09-24 17:23:43

标签: shell grep

我正在编写一个shell脚本并卡在一个地方。我有一个输入文件,其中我有两列第一列有一个日志文件名,第二列有第一次出现语法的行号。例如如下。

文件名:checkit.txt

内容

hellohowru.log 12345
helpmehere.log 45677
checkitout.log 67543

我想在txt文件checkit.txt中的每个日志文件中grep查找特定语法或单词,从相应行的行号开始。

如何为所有日志文件循环。

例如:tail -n +12345 hellohowru.log| grep -il 'exception' 如果发现异常,我可以拥有文件名。

请帮忙

3 个答案:

答案 0 :(得分:1)

您可以在while read循环中执行此操作:

while read -r file num; do
    tail -n +$num "$file" | grep -qi 'exception' && echo "$file"
done < checkit.txt > output.txt

答案 1 :(得分:1)

awk '
    NR==FNR { ARGV[ARGC]=$1; ARGC++; start[$1]=$2; next }
    (FNR > start[FILENAME]) && (tolower($0) ~ /exception/) { print FILENAME; nextfile }
' checkit.txt

上面使用nextfile的GNU awk和任意数量的打开文件的处理 - 如果你没有gawk然后在任何awk中它是:

awk '
    NR==FNR { ARGV[ARGC]=$1; ARGC++; start[$1]=$2; next }
    FNR==1  { close(prev); prev=FILENAME }
    (FNR > start[FILENAME]) && (tolower($0) ~ /exception/) && !seen[FILENAME]++ { print FILENAME }
' checkit.txt

答案 2 :(得分:0)

另一个简单的解决方案

ALGO:
- 逐行阅读文件
- 获取文件名和亚麻布
- 执行“异常”的tail + grep命令
- 如果找到匹配项,则打印文件名

cat checkit.txt | while read line
do
    LOGFILE=$(echo $line | awk -F ' ' '{print $1}')
    LINECNT=$(echo $line | awk -F ' ' '{print $2}')
    #echo "HI : $LOGFILE and $LINECNT"

    tail -n +$LINECNT $LOGFILE | grep -i "exception" 1> /dev/null
    if [ $? -eq 0  ]
    then
        echo "EXCEPTION IN $LOGFILE"
    fi
done