在 bash 中第 2 次出现 _(下划线)之后和点 (.) 之前提取值

Extract values after the 2nd occurrence of _ (underscore) and before dot (.) in bash

我在临时目录中有一个文件,里面写了一些行。我的目标是提取第二个下划线和点 (.) 之间的值。例如,

这是 filesample.txt 的内容示例:

--rwxr-x---                    235 2016-08-24 05:13 File_Name_2696553.txt
--rwxr-x---                   1274 2016-09-14 04:44 File_Name_2852659.xls
--rwxr-x---                   1802 2016-09-14 05:04 File_Name_2852992.pdf

我所做的如下:

cat ${tmp}filesample.txt | cut -b64- | awk -F"." '{ print  }'

这给了我想要的输出。但是,我认为一个更好的解决方案是让代码看起来在第二个下划线和点之间。

这样,如果每行内容末尾的 7 位数字变为 8 或更多,我就不必返回我的脚本并进行调整,因为 cut -b64- 正在查看第 64 个字节。

这可能是一个基本问题,我是 bash 脚本编写的新手。

您可以使用 awk:

awk '{split($NF, a, "[_.]"); print a[3]}' file

测试:

$ awk '{split($NF, a, "[_.]"); print a[3]}' file
2696553
2852659
2852992

要获取第 2 个 _ 和下一个 DOT 之间的值,您可以使用:

awk '{split($NF, a, /_/); sub(/\..*/, "", a[3]); print a[3]}' filesample.txt

2696553
2852659
2852992
  • 使用 split 函数,我们将最后一个文件拆分为 _(下划线)并取 a[3],这是第二个 _
  • 之后的值
  • 然后使用 sub 函数我们去掉 DOT 之后的所有内容,从而在第二个 _ 和下一个 DOT
  • 之间给出值
$ cat ip.txt 
--rwxr-x---                    235 2016-08-24 05:13 File_Name_2696553.txt
--rwxr-x---                   1274 2016-09-14 04:44 File_Name_2852659.xls
--rwxr-x---                   1802 2016-09-14 05:04 File_Name_2852992.pdf

$ grep -oP '.*_\K\d+' ip.txt 
2696553
2852659
2852992
  • o 只输出匹配的文本
  • P 使用基于 perl 的正则表达式
  • .*_ 以贪婪的方式将文本匹配到 _
  • \K 使用正向后视,直到那时匹配的文本才会成为输出的一部分
  • \d+一位或多位

使用 sed:

$ sed 's/.*_\([^.]*\).*//' filesample.txt
2696553
2852659
2852992

它捕获并输出最后一个下划线和最后一个点之间的值。

awk -F'[_.]' '{print $(NF-1)}' file

2696553
2852659
2852992