2017-10-12 83 views
1

我的问题是我需要从大量大于0的文本文件名的末尾提取行号。一旦我拥有列表行号,我需要从主文本文件中提取行。从多个文本文件名中提取行,然后从文本文件中提取这些行 - Linux

我想出了如何使用下面的命令执行第一步,该命令查找包含大小大于0字节的.sh.e的所有文件,然后拉出最后几个连续的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中做到这一点,但是想从命令行执行此操作,因为我经常需要这样做。

有什么想法?

感谢

+0

这句话“那么我需要从一个文本文件,它告诉我,我的工作的原始文件位置提取线。”目前还不清楚。最终结果应该是什么? – RomanPerekhrest

+0

最终结果是从../temp/files.2017-09-26.txt文件中的行(第)行X(我们从第一个命令获得的)的字符串列表。这是原始WAV文件路径的大量列表。 –

+0

,所以每次脚本都应该搜索文件'/ temp/files.2017-09-26.txt'中的数字'92','102'等,并输出包含这些数字的匹配行? – RomanPerekhrest

回答

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变量被分配有由返回文件名找到命令

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

+0

我不知道他想完成什么,检索的后缀不是行号提取?这只是对这些数字的grep? – Esteban

+0

@Esteban,我在 – RomanPerekhrest

+0

的问题处看到了评论,但他说了2次(一个在问题中,一个在第一个评论中),它是行号,所以我认为他误解了你所暗示的“匹配行“ – Esteban

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:剪下由.分隔的第一个字段:ie。线
  • tr "\n" " ":一个空格
  • sed 's/ /p;/g'更换新的线:通过p;
  • sed 's/;$//g'更换位:剥去最后;^

它创建由sed -n 'np;mp' < file.txt命令所需要的图案,其中nm是行号

+0

我有930个结果,你的命令似乎只列出了其中的850个。 找到。 -name“* .sh.e *”-type f -size + 0c | wc -l 不知道为什么。 –

+0

我不知道在没有文件样本的情况下可能发生错误的位置。我用2个文件和5行日志嘲笑了这个命令;)。您可以尝试在每个文件上执行sed以首先测试命令,如: – Esteban

+0

@MasaAsh'find。 -name“* .sh.e *”-type f -size + 0c | rev | cut -d'。' -f1 | xargs -I%sed -n%p ../ temp/files.2017-09-26.txt' – Esteban