找到以字符串

时间:2016-06-11 19:38:50

标签: regex bash awk grep

我有一个bash脚本,它将接收一个如下所示的字符串:

foo,user:johndoe,bar

值的顺序和数量未知,因此它也可能是:

bar,foo,baz,user:johndoe

我需要能够获取用户名 - 在本例中为johndoe

使用grep,我得到的最接近的是:

$ echo "foo,user:johndoe,bar" | grep -o 'user:.*,'
user:johndoe,

但这也让我user:,,这是我不想要的。我是新手,并且不确定grep是否是我应该使用的工具,或者awk或者更合适的东西。

3 个答案:

答案 0 :(得分:3)

对于简单的替换,sed将会:

% echo "foo,user:johndoe,bar" | sed 's/.*user:\([^,]*\).*/\1/'
johndoe

以上内容将用您的用户替换整个字符串:

s/
  .*                     # Match anything zero or more times
    user:                # Match literal user:
         \([^,]*\)       # Capture everything but , zero or more times in \1
                  .*     # Match to the end of the string
                    /\1/ # Replace with what we matched and saved in \1

GNU Grep还有一个-P选项,可以支持lookbehinds的PCRE:

% echo "foo,user:johndoe,bar" | grep -Po '(?<=user:)[^,]*'
johndoe

-P仍然具有很高的实验性,应尽可能避免使用。

答案 1 :(得分:2)

使用awk:

$ echo "foo,user:johndoe,bar" | awk -F: '$1=="user"{print $2}' RS=,
johndoe

如何运作

  • -F:

    这会将字段分隔符设置为:

  • $1=="user"{print $2}

    如果第一个字段为user,则打印第二个字段。

  • RS=,

    这会将记录分隔符设置为,

答案 2 :(得分:0)

echo "foo,user:johndoe,bar" | awk -F ":" '{print $2}' | awk -F "," '{print $1}'