一次读取一行文件,然后比较灰色日期(在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

我对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 ]];
    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