我想从bash脚本中的句子中提取一个单词。它使用逗号和空格作为分隔符。
ex:- date=crossed 122 name=foo , userid=234567 , sessionid=2233445axdfg5209 associd=2
我有上面的句子,其中有趣的部分是name = foo。键名总是相同但字符串foo可能会有所不同。其他参数也可能存在,也可能不存在。
我需要提取上面的键值对。 所以输出将是:
name=foo
在shell脚本中执行此操作的最佳方法是什么?
谢谢!
答案 0 :(得分:7)
grep在这里很有用:
grep -o 'name=[^ ,]\+'
答案 1 :(得分:3)
如果您知道name
之后的值永远不会包含空格或引号,并且没有其他复杂情况,那么您可以使用sed
单行代码执行此操作:
sed -e 's/^.*\(name=[^ ,]*\).*$/\1/'
这只是说要用匹配name=
的部分替换整行,后跟任意数量的非逗号,非空格字符。
如果有name="quoted string"
或name=string\ with\ escaped\ spaces
等可能性,这将不会非常强大。但它适用于有限的案例。
如果要将结果存储在shell变量中,可以执行类似(在bash中)的操作
pair=$(echo $input | sed -e 's/^.*\(name=[^ ,]*\).*$/\1/')
echo $pair
按预期打印name=foo
。
使用GNU sed 4.2.1和Bash 4.2.10进行测试
答案 2 :(得分:1)
如果“name = foo”始终位于该行的相同位置,您可以使用:
awk '{print($3)}'
,这将提取您的行中的第三个单词name=foo
。