使用grep提取单个单词

时间:2014-08-22 00:11:15

标签: bash shell

我有以下类型的strigs。它们中的每一个都是大字符串的一部分。

  1. ...... UUID: a062832a; UID: Z6IxbK9; UUID: null; ......
  2. ...... UUID: a062832a; UID: Z6IxbK9; ......
  3. ...... UID: Z6IxbK9; UUID: null; ......
  4. 我想提取与UID相关的值,即Z6IxbK9。现在我使用以下表达式来提取它。

    value=`echo $line | grep -o '\<UID.*\>' | awk -F\; '{ print $1 }' | cut -d: -f2 | tr -d ' '`
    

    我觉得这不是有效的方法。我正在调用四个不同的命令,这会减慢大文件的处理速度。

    任何人都可以提出更好的解决方案。

6 个答案:

答案 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)

带有look-behind的

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 ';'