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