我有以下类型的strigs。它们中的每一个都是大字符串的一部分。
...... UUID: a062832a; UID: Z6IxbK9; UUID: null; ......
...... UUID: a062832a; UID: Z6IxbK9; ......
...... UID: Z6IxbK9; UUID: null; ......
我想提取与UID相关的值,即Z6IxbK9
。现在我使用以下表达式来提取它。
value=`echo $line | grep -o '\<UID.*\>' | awk -F\; '{ print $1 }' | cut -d: -f2 | tr -d ' '`
我觉得这不是有效的方法。我正在调用四个不同的命令,这会减慢大文件的处理速度。
任何人都可以提出更好的解决方案。
答案 0 :(得分:2)
与非贪婪的匹配.*?
和-P
(perl regexp)一起玩,例如。试试这个:
grep -P -o ' UID:.*?;' file | sed 's/ UID: //;s/;//'
结果:
$ echo '...stuff stuff... UUID: a062832a; UID: ABCZ6IxbK9; UUID: null; ......
..foo bar.... UUID: a062832a; UID: DEFZ6IxbK9; ......
.. hello.... UID: ghiZ6IxbK9; UUID: null; ......
' | grep -P -o ' UID:.*?;' | sed 's/ UID: //;s/;//'
ABCZ6IxbK9
DEFZ6IxbK9
ghiZ6IxbK9
答案 1 :(得分:0)
您可以使用awk
:
string="...... UUID: a062832a; UID: Z6IxbK9; UUID: null; ......
...... UUID: a062832a; UID: Z6IxbK9; ......
...... UID: Z6IxbK9; UUID: null; ......"
awk '
{
for(i=1;i<=NF;i++)
if($i == "UID:") {
s=$(i+1)
sub(";","",s)
print s
}
}' <<<"$string"
输出:
Z6IxbK9
Z6IxbK9
Z6IxbK9
答案 2 :(得分:0)
这&#34; awk
- sed
&#34;组合:
awk -F' UID:' '{print $2}' file | sed 's/;.*//'
给出:
Z6IxbK9
Z6IxbK9
Z6IxbK9
答案 3 :(得分:0)
您可以通过使用-P
( Perl-regex )参数的单个grep命令来执行此操作。
$ grep -oP '\bUID:\s*\K[^;]*' file
Z6IxbK9
Z6IxbK9
Z6IxbK9
<强>解释强>
\b
在单词字符和非单词字符之间匹配的单词边界。UID:\s*
匹配字符串UID:
以及后面的空格。\K
这会丢弃之前匹配的字符UID:<space>
。[^;]*
现在它匹配任何不是;
零次或多次的字符。 答案 4 :(得分:0)
为什么不只是sed -n $'s/^.*[^U]UID:[\040\t]*\\([^;]*\\).*$/\\1/p'
?
答案 5 :(得分:0)
grep
:
$ cat file
...... UUID: a062832a; UID: Z6IxbK9; UUID: null; ......
...... UUID: a062832a; UID: Z6IxbK9; ......
...... UID: Z6IxbK9; UUID: null; ......
$ grep -oP '(?<=\bUID: )[^;]*' file
Z6IxbK9
Z6IxbK9
Z6IxbK9
说明:
\bUID - UID, preceded by white-space.
(?<=\bUID) - Any text preceded by \bUID
[^;]* - anything till (& not including) a ';'