在bash

时间:2016-09-15 14:09:32

标签: 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---                   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脚本的新手。

6 个答案:

答案 0 :(得分:3)

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

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

<强>测试

    jsonObject = {
    "log": [{
        "date": "15/09/2016",
        "time": "15:35:56",
        "temp": "16.0",
        "humidity": "95.0"
    }, {
        "date": "15/09/2016",
        "time": "15:35:59",
        "temp": "30.0",
        "humidity": "61.0"
    }, {
        "date": "15/09/2016",
        "time": "15:36:03",
        "temp": "30.0",
        "humidity": "60.0"
    }]
}

答案 1 :(得分:2)

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

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

2696553
2852659
2852992
  • 使用split函数,我们将_(下划线)归档到最后归档,并取a[3]这是第二_之后的值
  • 然后使用sub函数,我们在DOT之后剥离所有内容,从而在第二个_和下一个DOT之间提供值

答案 2 :(得分:2)

使用sed:

"My firstName is" + firstName + LastName

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

答案 3 :(得分:1)

$ 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+一个或多个数字

答案 4 :(得分:1)

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

2696553
2852659
2852992

答案 5 :(得分:0)

使用bash regex匹配的小尝试

$ while read -r line; do [[ $line =~ _([[:digit:]]{7,}). ]] && \
     NUM=${BASH_REMATCH[1]}; echo $NUM; done < <(awk '{print $5}' file)

2696553
2852659
2852992

输入file

--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