用bash处理文本行

用bash处理文本行,bash,cut,Bash,Cut,我正在使用以下结构保存一个包含日期和文件名的文件: date1 name1 date2 name2 ... dateN nameN 之后,我用while命令读取文件,并尝试比较date字段是否等于给定的日期。如果日期相同,我将保存名称,然后打印 while read line do if [ ‘$($line | cut -c 1-10)’ == ‘$(date +%Y-%m-%d)’ ] then name=$($linea | cut -c 12-100)

我正在使用以下结构保存一个包含日期和文件名的文件:

date1 name1
date2 name2
...
dateN nameN
之后,我用while命令读取文件,并尝试比较date字段是否等于给定的日期。如果日期相同,我将保存名称,然后打印

while read line
do
    if [ ‘$($line | cut -c 1-10)’ == ‘$(date +%Y-%m-%d)’ ]
    then
        name=$($linea | cut -c 12-100)
    fi
    echo $name
done < archivos.txt
读取行时
做
如果['$($line | cut-c 1-10)'='$(日期+%Y-%m-%d)]
然后
名称=$($linea |切割-c 12-100)
fi
echo$name
完成
在执行脚本之后,控制台会向我提供文件中的每个日期,并显示“command not found”错误


提前感谢:-)

按照您编写代码的方式,您正在尝试以命令的形式执行
$line
。您需要使用
echo
printf
将行写入标准输出:

$(printf %s "$line" | cut -c 1-10)

您的方法很有趣,但可能更容易跳过
while
循环,同时使用
awk
,将日期作为参数:

awk '$1~d {print $2}' d=$(date +%Y-%m-%d) archivos.txt
  • $1~d{print$2}
    如果第一个字段与给定日期匹配,则打印第二个字段
  • d=$(日期+%Y-%m-%d)
    将今天的日期传递给
    awk
样品
这是因为脚本找不到date命令。这给了你两个选择

选项1:找到日期二进制文件并给出完整路径

在命令提示符中运行“whereis date”,它应该会输出类似于his的内容 日期:/bin/date/usr/share/man/man1/date.1.gz 然后你可以改变

$(date +%Y-%m-%d)

选项2:导出应在其中查找二进制文件的路径

找不到日期的原因是它不在脚本的PATH变量中。您可以只将/bin/添加到路径,也可以在shell中使用相同的路径。跑 echo$PATH 在你的外壳中,它应该输出类似于他的东西

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
然后,您可以将scripts PATH变量设置为相同的值,使其如下所示:

export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
while read line
do
    if [ ‘$($line | cut -c 1-10)’ == ‘$(date +%Y-%m-%d)’ ]
    then
        name=$($linea | cut -c 12-100)
    fi
    echo $name
done < archivos.txt
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
读行时
做
如果['$($line | cut-c 1-10)'='$(日期+%Y-%m-%d)]
然后
名称=$($linea |切割-c 12-100)
fi
echo$name
完成
尝试了这一个,但它给了我“cut:stdin:unliked byte sequence”错误。有趣的是,我还没有使用awk命令。我有几个问题要问。当我在控制台中使用该命令时,它会打印名称,但当我接受相同的命令并尝试在脚本上执行该命令时,它返回以下错误:第1行:查找匹配的`''时出现意外的EOF第2行:语法错误:意外的文件结尾另一个问题是如何将结果保存在变量上而不是打印它?非常感谢,费多基!埃古农!嗯,奇怪,你评论的EOF不应该出现。你能查一下我的最新答案吗?我只打印第二个字段。关于第二个问题,是的,可以保存到变量中,但您希望如何保存?因为最终它将是一个值数组。它在脚本执行时给了我相同的错误。谢谢你的帮助:)同样失败了。我尝试了另一个awk命令,它似乎起了作用:awk'{if($1==d)name=$2}END{print name}'d=2014-01-27 archivos.txt谢谢fedorqui!
echo$name
不应该在if循环中吗?
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
while read line
do
    if [ ‘$($line | cut -c 1-10)’ == ‘$(date +%Y-%m-%d)’ ]
    then
        name=$($linea | cut -c 12-100)
    fi
    echo $name
done < archivos.txt