Bash:如何检查所有要检查的模式是否存在于Unix中的文件中

时间:2016-05-31 08:37:43

标签: bash shell unix grep pattern-matching

我正在尝试检查给定的所有模式是否都存在于文件中。如果是,则显示成功。

例如:我有一个如下文件

$ cat test.txt
ABC
123
xyz
ABC
MNO
qwe
$

我要搜索的模式是ABC和123。因此,在上述情况下,它应该显示成功。

如果我的模式是ABC和234,它应该显示FAILURE。

我试过如下:

$ grep -e ABC -e 123 test.txt && echo "SUCCESS" || echo "FAIL"
ABC
123
ABC
SUCCESS
$
$ grep -e ABC -e 234 test.txt && echo "SUCCESS" || echo "FAIL"
ABC
ABC
SUCCESS
$

但即使一种模式也失败,上述情况也会成功。

也尝试如下。但它在文件中需要2次迭代。

$ grep -w "ABC" test.txt && grep -w "123" test.txt && echo "SUCCESS" ||    echo "FAIL"
ABC
ABC
123
SUCCESS
$ grep -w "ABC" test.txt && grep -w "234" test.txt && echo "SUCCESS" ||    echo "FAIL"
ABC
ABC
FAIL
$

在单个文件解析中实现此目的的任何帮助吗?

2 个答案:

答案 0 :(得分:2)

您可以使用awk命令执行此操作:

awk -v patt='ABC,123' 'BEGIN {
   n = split(patt, words, /,/)
}
n {
   for (i in words)
      if ($0 ~ "\\<" words[i] "\\>") {
         --n
         delete words[i]
      }
}
END {
   exit n
}' test.txt && echo "SUCCESS" || echo "FAIL"

<强>解释

  • 此awk命令传递所有单词以在逗号拆分命令行参数patt
  • 中搜索
  • BEGIN块中,我们通过拆分输入字段并存储字数来搜索变量words
  • 来填充数组n
  • n > 0我们对一行中的每个数组元素执行单词搜索时,如果找到搜索到的单词,我们会从数组中删除该单词并递减n
  • END块中,如果退出时带有值n,则在找到所有单词后返回0(或成功)。

答案 1 :(得分:-1)

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);


        badgeLayout = (RelativeLayout) menu.findItem(R.id.badge).getActionView();           /*-------Cart Basket with Counter---------*/
        basketCount = (TextView) badgeLayout.findViewById(R.id.counter);
        CommonUtil.dbUtil.open();
        try {
            MainActivity.basketCount.setText(String.valueOf(CommonUtil.dbUtil.getCartItem().getCount()));
        } catch (Exception e) {
            MainActivity.basketCount.setText(String.valueOf("0"));
        }

        badgeLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(context, "Cart Clicked", Toast.LENGTH_SHORT).show();
                /*
                * menuItemClicked represents ToolBar OverFlow (...) menu is clicked.
                * */
                Config.menuItemClicked = true;
                SharedPreferences.Editor editor = CommonUtil.pref.edit();
                editor.putBoolean("cart_Clicked", Config.menuItemClicked);
                editor.apply();

                Intent next = new Intent(context, ProductActivity.class);
                startActivity(next);

            }
        });

        invalidateOptionsMenu();
        return super.onCreateOptionsMenu(menu);
    }