如何使用bash检查文件中的行

时间:2014-11-07 12:48:02

标签: bash

我有一个这样的日志文件:

 20141107 14:15:02;10.0.0.5;/home/it/17066.txt;0
 20141107 14:15:32;10.0.0.5;/home/it/17076.txt;0
 20141107 14:16:15;10.0.0.5;/home/it/17086.txt;0
 ...

我的bash脚本解析大日志文件并创建新的小日志文件。脚本检查小日志文件,如果不存在,请创建:

if [ ! -f "$path/$name" ]; then

mkdir -p "$path"
touch "$path/$name"
echo "$year$month$day $time;$ip;$file;$size" >> "$path/$name"

fi

如果日志文件存在,我想写入该文件。我试试这个:

if [ ! -f "$path/$name" ]; then

mkdir -p "$path"
touch "$path/$name"
echo "$year$month$day $time;$ip;$file;$size" >> "$path/$name"

else 
echo "$year$month$day $time;$ip;$file;$size" >> "$path/$name"
fi

如果文件存在与否,它是否正常工作。但是在日志文件中写相同的行:

 20141107 14:15:02;10.0.0.5;/home/it/17066.txt;0
 20141107 14:15:32;10.0.0.5;/home/it/17076.txt;0
 20141107 14:16:15;10.0.0.5;/home/it/17086.txt;0
 20141107 14:15:02;10.0.0.5;/home/it/17066.txt;0
 20141107 14:15:32;10.0.0.5;/home/it/17076.txt;0
 20141107 14:16:15;10.0.0.5;/home/it/17086.txt;0
 ...

如果日志文件中存在行,则需要执行写操作。如果日志文件中存在行,则跳过。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

str="$year$month$day $time;$ip;$file;$size"
if ! grep -q "^$str$" "$path/$name"; then
    echo "$year$month$day $time;$ip;$file;$size" >> "$path/$name"
fi

请注意,如果输出文件变大,则效率不高。

答案 1 :(得分:0)

为什么不这样做:

if [ ! -f "$path/$name" ]; then
    mkdir -p "$path"
    touch "$path/$name"
fi
echo "$year$month$day $time;$ip;$file;$size" >> "$path/$name"