uih*_*dff 16 shell shell-script
操作系统:内核 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"
Run Code Online (Sandbox Code Playgroud)
目标:我需要搜索包含“text4:”(无引号)的行,然后将该字符串之后的所有字符提取到行尾。
所需输出: “lkpird sdfd”(带引号)
目前我有...
command | grep 'text4:' | awk -F': ' '{print $3}'
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来写这个?
Joh*_*024 24
$ command | sed -n 's/.*text4://p'
"lkpird sdfd"
Run Code Online (Sandbox Code Playgroud)
-n告诉 sed 不要打印,除非我们明确要求它。 s/.*text4:// 告诉 sed 删除从行首到text4:. 如果找到这样的行,则p告诉 sed 打印它。
grep -P$ command | grep -oP '(?<=text4:).*'
"lkpird sdfd"
Run Code Online (Sandbox Code Playgroud)
-o告诉 grep 只打印匹配的部分。 (?<=text4:).*匹配后面text4:但不包括 的任何文本text4:。
该-P选项需要 GNU grep。 因此,它不适用于 busybox 的 builtin grep,也不适用grep于 BSD/Mac OSX 系统上的默认设置。
原来的 grep-awk 解决方案可以简化:
$ command | awk -F': ' '/text4: /{print $2}'
"lkpird sdfd"
Run Code Online (Sandbox Code Playgroud)
$ command | awk '/text4:/{sub(/.*text4:/, ""); print}'
"lkpird sdfd"
Run Code Online (Sandbox Code Playgroud)
/text4:/选择包含text4:. sub(/.*text4:/, "")告诉 awk 删除从行首到行上最后一次出现的所有文本text4:。 print告诉 awk 打印这些行。