用bash处理文本行

时间:2014-01-28 14:46:15

标签: bash cut

我正在使用此结构保存包含日期和文件名的文件:

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

执行完脚本后,控制台会通过“找不到命令”错误向我提供文件中的每个日期。

提前致谢: - )

3 个答案:

答案 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作为命令。您需要使用echoprintf将行写入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