我正在使用此结构保存包含日期和文件名的文件:
date1 name1
date2 name2
...
dateN nameN
之后,我正在使用while命令读取文件,并尝试比较日期字段是否等于给定的日期。如果日期相同,我将保存名称然后打印。
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
执行完脚本后,控制台会通过“找不到命令”错误向我提供文件中的每个日期。
提前致谢: - )
答案 0 :(得分:2)
您的方法很有趣,但可能更容易跳过使用while
循环并一起使用awk
,将日期作为参数:
awk '$1~d {print $2}' d=$(date +%Y-%m-%d) archivos.txt
$1~d {print $2}
如果第一个字段与给定日期匹配,则打印第二个字段。d=$(date +%Y-%m-%d)
将今天的日期传递给awk
。$ cat a
2014-01-28 hello
2014-01-28 byetwo
2014-02-28 bye
2014-01-29 bye
$ awk '$1~d {print $2}' d=$(date +%Y-%m-%d) a
hello
byetwo
答案 1 :(得分:1)
编写代码的方式,您尝试执行$line
作为命令。您需要使用echo
或printf
将行写入stdout:
$(printf %s "$line" | cut -c 1-10)
答案 2 :(得分:-1)
这是因为您的脚本找不到date命令。这为您提供了两个选择。
选项1:找到日期二进制文件并提供完整路径
在命令提示符下运行“whereis date”,它应该输出他的内容 日期:/ bin / date /usr/share/man/man1/date.1.gz 然后你可以改变
$(date +%Y-%m-%d)
到
$(/bin/date +%Y-%m-%d)
选项2:导出应该查找二进制文件的路径
无法找到原因日期是因为它不在脚本的PATH变量中。您可以将/ bin /添加到PATH,也可以与shell中的相同。跑 echo $ PATH 在你的shell中它应该输出他的
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
然后你可以做的是将脚本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