shell 如何在grep后只取一部分?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 如何在grep后只取一部分?相关的知识,希望对你有一定的参考价值。
如图,经过ip -h address | grep inet | head -1代码后输出结果,但是只希望取数字ip地址的部分,请问如何提取
这个好说,可以继续加管道符,然后用cut 命令截取对应的字段,cut命令可以按位置截取,也可以按分隔符截取第几个字段。例如cut -f ' ' 3
表示以空格为分隔符,取第三个字段 参考技术A
题主你好,
代码及测试截图如下:
希望可以帮到题主, 欢迎追问
如何在 shell 脚本中将此正则表达式与 grep 一起使用?
【中文标题】如何在 shell 脚本中将此正则表达式与 grep 一起使用?【英文标题】:How to use this regex with grep in shell script? 【发布时间】:2022-01-14 00:16:01 【问题描述】:我需要在 shell 脚本中提取公钥,不知道如何使用它。我是 shell 脚本的新手。 https://regex101.com/r/SXDEaU/1
文件内容:
public_key=#STARTKEY#<public key base64 encoded>#ENDKEY#
正则表达式:/public_key=#STARTKEY#(.*)#ENDKEY#/s
由于key是base64编码的,所以是多行字符串。
期望的输出:
【问题讨论】:
请将该示例输入的所需输出(无描述、无图像、无链接)添加到您的问题(无评论)。grep -Pzo '(?<=public_key=#STARTKEY#)[\s\S]*(?=#ENDKEY#)' file
?
【参考方案1】:
perl -M5.010 -0777ne'say for /public_key=#STARTKEY#(.*?)#ENDKEY#/s' file
密钥是-0777
,它将整个文件作为一行读入。
【讨论】:
我会使用([^#]*)
而不是(.*)
,然后从匹配项中删除所有非base64字符(如换行符)
@Fravadona,我没有看模式;我只是展示了如何按要求使用它。 [^#]*
不正确,应该是 (?:(?!#ENDKEY#).)*
。但是.*?
在这里也可以,而且会比.*
更好。调整答案。 /// 不要求去除非 base64 字符,并不总是可取的,并且在不知道正在使用哪种 base64 风格的情况下无法完成。
哦是的,perl当然有非贪心*
【参考方案2】:
使用awk
使用其RS
变量并将其设置为段落模式,请尝试以下代码。
awk -v RS= 'match($0,/public_key=#STARTKEY#.*#ENDKEY#/)print substr($0,RSTART+21,RLENGTH-29)' Input_file
【讨论】:
不支持空行。但在允许的情况下,一个人极不可能遇到任何问题。所以这可能不是问题。以上是关于shell 如何在grep后只取一部分?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 shell 脚本中将此正则表达式与 grep 一起使用?
使用cron进行调度时如何在shell脚本中grep命令的输出
Shell脚本如何实现对一个文件按关键字行来分成若干个小文件?
linux shell编程 根据端口获取进程pid 直接用命令netstat -anp grep 端口号 在shell中如何获取PID?