我需要从日志文件中提取条目并将它们放在错误文件中。
每次运行脚本时,我都不想复制错误文件中的条目,所以我创建了这个:
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;
因此,脚本会将相同的条目添加到错误文件中。
有关为何发生这种情况的任何想法?
答案 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
消息,几乎所有代码都可以归结为使用两个grep
,bash
process substitution可能会执行的操作,sponge
和touch
表示第一次运行的案例:
[ ! -f $3 ] && touch $3 ; grep -vf $3 <(grep $1 $2) | sponge -a $3