操作系统:内核2.6.x
实用工具:来自 busybox 1.2x
一个命令输出多行文本。
string1 text1: "asdfs asdf adfas"
string2 text2: "iojksdfa kdfj adsfj;"
string3 text3: "skidslk sadfj"
string4 text4: "lkpird sdfd"
string5 text5: "alskjfdsd safsd"
目标:我需要搜索包含“text4:”(无引号)的行,然后提取该字符串之后的所有字符到该行的末尾。
期望的输出:“lkpird sdfd”(带引号)
目前我有...
command | grep 'text4:' | awk -F': ' '{print $3}'
有没有更简单的方法来写这个?
答案1
使用 sed
$ command | sed -n 's/.*text4://p'
"lkpird sdfd"
-n
告诉 sed 不要打印,除非我们明确要求它打印。 s/.*text4://
告诉 sed 删除从行首到最后出现 的所有文本text4:
。如果找到这样的行,则p
告诉 sed 打印它。
使用grep -P
$ command | grep -oP '(?<=text4:).*'
"lkpird sdfd"
-o
告诉 grep 仅打印匹配的部分。 (?<=text4:).*
匹配后面的任何文本text4:
,但不包括text4:
.
该-P
选项需要 GNU grep。 因此,它不能与 busybox 的内置命令一起工作,也不能与BSD/Mac OSX 系统上的grep
默认命令一起工作。grep
使用 awk
原来的 grep-awk 解决方案可以简化:
$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"
使用 awk(替代)
$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
"lkpird sdfd"
/text4:/
选择包含 的行text4:
。 sub(/.*text4:/, "")
告诉 awk 删除从行首到最后一次出现 的所有文本text4:
。 print
告诉 awk 打印这些行。
答案2
及其grep
PCRE 支持和\K
通知。
command |grep -Po 'text4: \K.*'