从多个文本文件名中提取行,然后从文本文件中提取这些行 - Linux

时间:2017-10-12 14:05:58

标签: regex linux awk sed

我的问题是我需要从一堆大小超过0的文本文件名的末尾提取行号。一旦我有行号列表,我需要从主文本文件中提取行。

我想出了如何使用下面的命令执行第一步,该命令查找包含大小为>的.sh.e的所有文件。 0字节,它然后拉出包含jobID的最后几个字符,并且sed命令剥离前7个字符(这可能也可以更优雅地完成),然后为我们提供了一个很好的行号列表。

文件名示例:

Job_2017-09-25-08-50-28-ahill.sh.e1191.92
Job_2017-09-25-08-50-28-ahill.sh.e1191.102
Job_2017-09-25-08-50-28-ahill.sh.e1191.252
Job_2017-09-25-08-50-28-ahill.sh.e1191.301

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed 's/^.\{7\}//'

92
102
252
301

然后我需要从文本文件中提取行,该文件告诉我作业的原始文件位置。

我无法将此传递给sed或awk来解析主日志。我尝试过以下方法:

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk (NR=sed s/^.\{7\}//) ../temp/files.2017-09-26.txt

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | sed -n "$(sed 's/^.\{7\}//')p" ../temp/files.2017-09-26.txt

find . -name "*.sh.e*" -type f -size +0c | grep -E -o ".e1191.{0,10}" | awk "NR==$(sed 's/^.\{7\}//')" ../temp/files.2017-09-26.txt

所有似乎都失败或表达错误。我现在可以在Excel中执行此操作,但我希望从命令行执行此操作,因为我必须经常这样做。

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:1)

不是最漂亮的命令,但它应该有效:

sed -n $(find . -name "*.sh.e*" -type f  -size +0c |rev |cut -d'.' -f1 | tr "\n" " " | sed -e 's/ /p;/g' -e 's/;$//g') < ../temp/files.2017-09-26.txt

它的作用:

  • find . -name "*.sh.e*" -type f -size +0c:列出文件
  • rev:反转文件名的字母
  • cut -d'.' -f1:剪切由.分隔的第一个字段:即。线条
  • tr "\n" " ":用空格替换新行
  • sed 's/ /p;/g':用p;
  • 替换空格
  • sed 's/;$//g':删除最后一个; ^

它创建了sed -n 'np;mp' < file.txt命令所需的模式,其中nm是行号

答案 1 :(得分:1)

优化且快速查找解决方案:

find . -type f -name "*.sh.e[0-9]*" -size +0c -exec sh -c 'fn=$1; n=${fn##*.}; \
        sed -n "$n p" ../temp/files.2017-09-26.txt' _ {} \;
  • fn=$1 - fn变量分配了 find 命令返回的文件名

  • n=${fn##*.} - 从文件名中提取所需的数字后缀(例如92102等)