通过 grep/awk/cut 删除字符串中多余的点

Remove extra dot in a String by grep/awk/cut

我在文件中有以下文本,例如,output.txt

[test.tracking_utils] INFO: Tracking subtool usage: main_test
[TEST & SPEC] INFO: Uploaded file test.zip with bucket URI test/20210804144418.zip.

如何使用 grep o 类似的东西来获取 test/20210804144418.zip 的值?

我试过了

tail output.txt | grep ". test/" | awk {print $NF}
tail output.txt | grep -m1 .test/ | rev | cut -d' ' -f1 | rev

it returns test/20210804144418.zip. with extra . 你知道如何去掉最后多余的 . 吗?有什么建议吗?

您可以通过

管道删除尾随 .
sed 's/\.$//'

但在这种情况下可能没有必要。使用 GNU greppcregrep 您可以直接提取路径:

grep -Po 'with bucket URI \K.*(?=.)'

您可以使用这个 grep:

grep -oE -m1 'test/[^[:blank:]]+\.[^.]+' file

test/20210804144418.zip

正则表达式详细信息:

  • test/:匹配test/
  • [^[:blank:]]+: 匹配 1+ 个非空白字符
  • \.: 匹配一个点
  • [^.]+: 匹配 1+ 个任意非点字符

使用awk,您可以尝试关注一次。

awk '/test\//{sub(/\.$/,"");print $(NF);exit}' Input_file

第二个解决方案:这里使用awkmatch函数。

awk 'match([=11=],/URI test\/[0-9]+\.zip/){print substr([=11=],RSTART+4,RLENGTH-4);exit}' Input_file

假设:

  • 所需 output/string 的开头不一定以 test
  • 开头
  • 所有包含所需字符串的行都包含 with bucket URI
  • 感兴趣的字符串将始终是最后一个字段(在 space 分隔的行中)
  • 感兴趣的行可能不止一种

示例输入:

$ cat output.txt
[test.tracking_utils] INFO: Tracking subtool usage: main_test
[TEST & SPEC] INFO: Uploaded file test.zip with bucket URI test/20210804144418.zip.
[test.tracking_utils] INFO: Tracking subtool usage: main_test
[TEST & SPEC] INFO: Uploaded file test.zip with bucket URI other/101423412.pre.zip.

几个 awk 个想法:

awk '/with bucket URI/{sub(/\.$/,"",$NF);print $NF}' output.txt
awk '/with bucket URI/{print substr($NF,1,length($NF)-1)}' output.txt

这两个生成:

test/20210804144418.zip
other/101423412.pre.zip