我是bash和社区的新手,所以请耐心等待。
我正在尝试创建一个简单的脚本:
- 逐行读取 txt 文件
- 从每行中获取特定于 Grep 的字符串(在本例中为日期),并将其分配给变量
- 将其与之前定义的另一个日期进行比较。
- 如果日期更大/更小,则打印整行。
这就是我试图实现它的方式:
compareDate="$(date -d '2005-01-01' '+%Y-%m-%d')"
while read -r line;
do
date="$(grep -oP 'foo K.*')"
if [[ $date < $compareDate ]];
echo $line
then
continue
fi
done < text.txt
文本.txt包含:
foo 2000-01-01
foo 2002-01-01
foo 2004-01-01
foo 2005-01-01
foo 2006-01-01
foo 2007-01-01
foo 2008-01-01
执行时的结果是:
./line.sh
foo 2000-01-01
我认为确切的问题是"date"grep定义了整个文本,而不是一次一行:
mg@mg:~/bash -x line.sh
++ date -d 2005-01-01 +%Y-%m-%d
+ compareDate=2005-01-01
+ read -r line
++ grep -oP 'foo K.*'
+ date='2002-01-01
2004-01-01
2005-01-01
2006-01-01
2007-01-01
2008-01-01'
+ [[ 2002-01-01
2004-01-01
2005-01-01
2006-01-01
2007-01-01
2008-01-01 < 2005-01-01 ]]
+ echo foo 2000-01-01
foo 2000-01-01
+ continue
+ read -r line
m@mg:~$
另外,一旦"日期"在循环中被正确定义并正确定义,我想在比较之前也应该将其转换为日期格式?
我也尝试使用 awk 而不是 grep,但最终结果是一样的。
我可能已经查看了有关此的所有类似线程,但我不确定我错过了什么。
PS:我意识到代码很可能充满了不正确的语法和格式,所以很抱歉:)
任何帮助都非常感谢。
你快到了。正如您所发现的,grep
会啜饮所有标准输入 尽管read
试图逐行处理它。 相反,您可以显式馈送变量$line
以grep
here string
表示法<<< "$line"
.请尝试以下操作:
compareDate="$(date -d '2005-01-01' '+%Y-%m-%d')"
while read -r line; do
date="$(grep -oP 'foo K.*' <<< "$line")"
if [[ $date < $compareDate ]]; then
echo "$line"
fi
done < text.txt
结果:
foo 2000-01-01
foo 2002-01-01
foo 2004-01-01
此外,请将线路echo "$line"
放在then
和fi
之间。 否则,无论if
条件如何,都将调用它。
希望这有帮助。