在grep -q上使用变量不会产生创建

时间:2017-03-01 16:48:32

标签: linux shell grep

我需要从日志文件中提取条目并将它们放在错误文件中。

每次运行脚本时,我都不想复制错误文件中的条目,所以我创建了这个:

package abtech.waiteriano.com.waitrer;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import abtech.waiteriano.com.waitrer.adapters.CustomMenuListViewAdapter;
import abtech.waiteriano.com.waitrer.connection_class.ConnectionClass;
import abtech.waiteriano.com.waitrer.getters_and_setters.MenuListItem;

public class MenuLVActivity extends AppCompatActivity {

    ListView menuListView;
    static ArrayList<MenuListItem> listMenuArray = new ArrayList<MenuListItem>();
    CustomMenuListViewAdapter customMenuListViewAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu_lv);
        menuListView = (ListView) findViewById(R.id.menuLV);
        customMenuListViewAdapter = new CustomMenuListViewAdapter(MenuLVActivity.this, R.layout.menu_row_list,listMenuArray);
        menuListView.setAdapter(customMenuListViewAdapter);
        String menuListSTR = "Select ID,Code,Name,Name2 From Presets Where Active = 1 And Rest_ID_Active = 1 AND OutLet_ID_Active = 1 ORDER BY Code";
        ResultSet rs = ConnectionClass.Ret_RS(menuListSTR);
        try {
            while (rs.next()){
                listMenuArray.add(new MenuListItem(rs.getString("Name")));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

使用以下方式运行:

grep $1 $2 | while read -r line ; do
    echo "$line"
    if [ ! -z "$line" ]
    then
            echo "Line is NOT empty"
            if grep -q "$line" $3; then
                    echo "Line NOT added"
            else
                    echo $line >> $3
                    echo "Line added"
            fi
    fi
done

第一次运行脚本时,它会找到条目,并创建错误文件(之前没有错误文件)。

下一次,此行从未找到最近添加到错误文件的行

  

如果grep -q&#34; $ line&#34; $ 3;

因此,脚本会将相同的条目添加到错误文件中。

有关为何发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:3)

这很可能是因为您没有搜索该行本身,而是将该行视为正则表达式。我们假设你有这个档案:

$ cat file
[ERROR] This is a test
O This is a test

你试图找到第一行:

$ grep "[ERROR] This is a test" file
O This is a test

正如您所看到的,它与我们正在查找的行(导致重复)不匹配,并且匹配不同的行(导致删除的条目)。您可以使用-F -x来搜索与整行匹配的文字字符串:

$ grep -F -x "[ERROR] This is a test" file
[ERROR] This is a test

将此应用于您的脚本:

grep $1 $2 | while read -r line ; do
    echo "$line"
    if [ ! -z "$line" ]
    then
            echo "Line is NOT empty"
            if grep -F -x -q "$line" $3; then
                    echo "Line NOT added"
            else
                    echo $line >> $3
                    echo "Line added"
            fi
    fi
done

这里有额外的修复和清理:

grep -e "$1" -- "$2" | while IFS= read -r line ; do
    printf '%s\n' "$line"
    if [ "$line" ]
    then
            echo "Line is NOT empty"
            if grep -Fxq -e "$line" -- "$3"; then
                    echo "Line NOT added"
            else
                    printf '%s\n' "$line" >> "$3"
                    echo "Line added"
            fi
    fi
done

PS:使用awk的片段,这可能更短,更快,时间复杂度更高。

答案 1 :(得分:0)

无需检查空行;第一个grep仅检查带有“ERROR”一词的行,该行不能为空。

如果您没有诊断echo消息,几乎所有代码都可以归结为使用两个grepbash process substitution可能会执行的操作,spongetouch表示第一次运行的案例:

[ ! -f $3 ] && touch $3 ; grep -vf $3 <(grep $1 $2) | sponge -a $3