通过 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 grep
或 pcregrep
您可以直接提取路径:
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
第二个解决方案:这里使用awk
的match
函数。
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
我在文件中有以下文本,例如,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 grep
或 pcregrep
您可以直接提取路径:
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
第二个解决方案:这里使用awk
的match
函数。
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