一次读取一行文件,然后比较灰色日期(在bash中)
我对bash和整个社区都是新手,所以请容忍我 我正在尝试创建一个简单的脚本:一次读取一行文件,然后比较灰色日期(在bash中),bash,date,while-loop,grep,Bash,Date,While Loop,Grep,我对bash和整个社区都是新手,所以请容忍我 我正在尝试创建一个简单的脚本: 逐行读取txt文件 从每行中提取特定于Grep的字符串(在本例中为date),并将其分配给变量 将其与之前定义的另一个日期进行比较 如果日期较大/较小,则打印整行 这就是我试图实现它的方式: compareDate="$(date -d '2005-01-01' '+%Y-%m-%d')" while read -r line; do date="$(grep -oP 'foo \K.*')" if [[ $date
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
执行时的结果是:
./line.sh
foo 2000-01-01
我认为确切的问题是,“日期”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:~$
mg@mg:~/bash-x line.sh
++日期-d 2005-01-01+%Y-%m-%d
+比较日期=2005-01-01
+read-r行
++grep-oP'foo\K.*'
+日期: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
+继续
+read-r行
m@mg:~$
此外,一旦“日期”在循环中被grepped并正确定义,我想在比较之前也应该将其转换为日期格式
我也试着用awk代替grep,但最终的结果是一样的
我可能已经看过了所有与此相关的类似帖子,我不确定我遗漏了什么
PS:我意识到代码很可能充满了不正确的语法和格式,因此对此表示歉意:)
非常感谢您的帮助。您就快到了。正如您所发现的,
grep
slurps所有标准输入
尽管read
尝试逐行处理它。
您可以改为使用显式地将变量$line
馈送到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:~$
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