如何在 bash 中解析文件中的一行

如何在 bash 中解析文件中的一行

我对 Shell 脚本还很陌生,我对文件解析有一个小疑问。

因此,这就是我想做的事情:
我运行 svn merge 命令,并生成冲突文件,我的冲突文件存储为 conflicts.txt

我想要做的是逐行读取这个文件并解析一行来匹配一些关键字。

例如文件中的其中一行如下所示:
C Client/Game/src/test/test.php

现在我想解析这一行并搜索关键字test,如果找到它我想对它执行一些操作,例如以退出状态 2、3 等中止。

例如,我想遍历一个名为“FILENAME”的文本文件,它看起来像这样

30 '!' C Client/test.js

31 '!' C Client/test2.js

32 '!' C Client/test3.js `

我正在做的是使用 while 循环和 cat 命令对文件进行 cat 操作

cat $FILENAME | while read LINE do echo $LINE done

这里我只是打印了这一行,我想知道如何在这一行中搜索关键字,如果我找到了这个关键字,我该如何对其执行一些操作,比如以状态 1 退出

您能否建议一些方法来做到这一点?

答案1

有很多方法可以做到这一点,具体取决于您的需要。

  1. 只需打印包含关键字的所有行test

    grep test file.txt
    
  2. 相同,但针对多个关键字。创建一个包含所有关键字的文件,每行一个,然后运行

    grep -f keywords.txt file.txt
    
  3. 逐行处理文件,如果发现行则退出

    while read line; do echo $line | grep test && break; done < file.txt
    
  4. 如果行匹配,则以状态 1 退出。不幸的是,如果我没记错的话(不是 100% 确定),bash 只允许您在函数中设置返回值。因此,要获取退出状态,您需要使用其他方法。例如 Perl:

    perl -ne '/test/ && exit(1)' file.txt
    
  5. 虽然您无法设置退出值,但您仍然可以使用 bash 执行类似操作。最后运行的命令的退出值始终保存在 bash$?中,这意味着您可以测试该值$?并采取相应措施:

    while read line; do let c++; echo $line | grep test >/dev/null; 
      if [[ $? == 0 ]] ; then echo Match for line $c : $line;
      else echo No match for line $c; fi  
    done < file.txt 
    

答案2

最简单的方法就是根本不逐行解析文件。

grep -q 'keyphrase' filename && exit <exitcode> 

答案3

$ function some_action { 
    echo found keyword
}

$ if grep -q -m1 -e 'test3' < input;
  then 
      some_action
  fi
found keyword

grep 选项:

  • -q:安静;不打印匹配项
  • -m1:匹配一次后退出
  • -e:表达式(关键字)

例如:

$ grep . input
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js

$ if grep -q -m1 -e 'test3' < input; then some_action ; fi
found keyword

相关内容