【问题标题】:bash tail error: cannot open input when using -c optionbash 尾错误:使用 -c 选项时无法打开输入
【发布时间】:2019-04-05 18:21:22
【问题描述】:

我正在尝试确定在何处切断原木以缩小其大小。 该日志于 2010 年开始,并由此后每天运行的脚本附加。我正在查找日志的每一行以提取其中包含日期的行,然后我想获取这些行的最后 4 个字符,因为它代表年份。然后我可以确定例如 2018 年首先出现在哪一行,并截断上面的文件。

我正在尝试使用 tail -c 4 来获取每行的最后 4 个字符,但我不断收到来自 tail 的“无法打开输入”错误。

代码:

#!/bin/bash

date=$(grep ' EST ' input.log)

IFS=$'\n'

for line in $date
do
   printf "%s\n" "$line" > output.tmp
   chmod 777 output.tmp
   echo $(tail -c 4 output.tmp)
done

当我只使用“tail output.tmp”运行此代码时,没有任何选项,它会按预期工作并输出当前正在迭代的整行。

但是当我尝试使用 tail -c 4 时,我得到了“tail: cannot open input”错误。

我已经检查了 tail 的手册页,并且 -c 选项可用,那么我做错了什么?或者除了使用tail之外还有更好的方法来解决这个问题吗? (我的系统上没有可用的 grep -o 选项)。

【问题讨论】:

  • $(tail -1 trunc_dailyEO.tmp | rev | cut -c-4 | rev) 工作吗?
  • 您想像代码示例中那样尾随文件 trunc_dailyEO.tmp 还是文件 output.tmp ?所以也许是愚蠢的问题,但trunc_dailyEO.tmp 是否存在于您执行脚本的目录中? ;)
  • 哦,哎呀,它们都应该是 output.tmp。我试图简化问题的名称并错过了一个。我修好了它。我写入临时文件然后读取临时文件的原因是因为我知道 tail 查找文件,而不是字符串。
  • tail -1 与 tail(无选项)的结果相同,因为它是单行文件。但我的系统上没有 rev 命令。

标签: bash solaris-10


【解决方案1】:

您不需要临时文件:

#!/bin/bash

date=$(grep ' EST ' input.log)

IFS=$'\n'

for line in $date
do
   echo ${line: -4}
done

【讨论】:

  • 这非常有效。我能问一下 ${line: -4} 叫什么,这样我可以了解更多信息吗?
  • @bk_32:您可以通过Shell Parameter Expansion 进行搜索。简单来说就是:${parameter:offset:length}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 2016-07-07
相关资源
最近更新 更多