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

在bash中第二次出现的z(下划线)之后和点(.)之前提取值,bash,awk,cut,cat,Bash,Awk,Cut,Cat,我有一个文件,其中有几行写在临时目录中。我的目标是提取第二个下划线和点(.)之间的值。比如说, 下面是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---

我有一个文件,其中有几行写在临时目录中。我的目标是提取第二个下划线和点(.)之间的值。比如说,

下面是
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 $1 }'
这给了我想要的输出。但是,我认为更好的解决方案是让代码看起来介于第二个下划线和点之间

这样,如果每行内容末尾的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

要获取第二个
点和下一个
点之间的值,可以使用:

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

2696553
2852659
2852992
  • 使用
    split
    函数,我们正在按
    \u
    (下划线)拆分最后一个字段,并取
    a[3]
    ,它是第二个
    \u
    之后的值
  • 然后使用
    sub
    函数,我们去掉
    DOT
    之后的所有内容,从而给出第二个
    和下一个DOT之间的值
  • o
    仅输出匹配的文本
  • P
    使用基于perl的正则表达式
  • *.\u
    以贪婪的方式将文本匹配到
    .
  • \K
    使用正向查找,在此之前匹配的文本不会成为输出的一部分
  • \d+
    一个或多个数字
使用sed:

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

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

这一行的作用是什么?您能解释一下吗?在答案中添加了解释。使用此解决方案:
awk'{split($NF,a,[[u]]);打印[3]}'让我们改进:)!
awk -F'[_.]' '{print $(NF-1)}' file

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

2696553
2852659
2852992