我的问题是我需要从一堆大小超过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中执行此操作,但我希望从命令行执行此操作,因为我必须经常这样做。
有什么想法吗?
由于
答案 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
命令所需的模式,其中n
和m
是行号
答案 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##*.}
- 从文件名中提取所需的数字后缀(例如92
,102
等)