如何在bashshell脚本中从行中提取单词

如何在bashshell脚本中从行中提取单词,bash,Bash,我想从bash脚本中的一个句子中提取一个单词。它使用coma和空格作为分隔符 ex:- date=crossed 122 name=foo , userid=234567 , sessionid=2233445axdfg5209 associd=2 我有上面的句子,其中有趣的部分是name=foo。键名总是相同的,但字符串foo可能不同。其他参数也可能存在,也可能不存在 我需要提取上面的键值对。 因此,产出将是: name=foo 在shell脚本中,最好的方法是什么 谢谢 如果您知道na

我想从bash脚本中的一个句子中提取一个单词。它使用coma和空格作为分隔符

ex:- date=crossed 122 name=foo , userid=234567 , sessionid=2233445axdfg5209  associd=2
我有上面的句子,其中有趣的部分是name=foo。键名总是相同的,但字符串foo可能不同。其他参数也可能存在,也可能不存在

我需要提取上面的键值对。 因此,产出将是:

name=foo
在shell脚本中,最好的方法是什么


谢谢

如果您知道
name
后面的值永远不会包含空格或引号,并且没有其他复杂情况,那么您可以使用
sed
一行:

sed-e的/^.*\(name=[^,]*\).$/\1/'

这只是说用匹配
name=
的部分替换整行,后面跟任意数量的非逗号、非空格字符

如果存在像
name=“quoted string”
name=string\with\escape\spaces
这样的可能性,那么这将不会非常健壮。但它将在有限的情况下起作用

如果要将结果存储在shell变量中,可以执行以下操作(在bash中)

按预期打印
name=foo

使用GNU sed 4.2.1和Bash 4.2.10测试,如果“name=foo”始终位于行中的同一位置,您可以简单地使用:
awk'{print($3)}'
,它将提取行中的第三个单词,在您的情况下是
name=foo

grep在这里很有用:

grep -o 'name=[^ ,]\+'

他说“其他参数也可能存在,也可能不存在”,因此您可能不会使用位置逻辑。每个“foo”键后是否总是有空格和逗号?“foo”键可能包含空格吗?更新后的意思是,您可以通过将上面的
sed
命令替换为
egrep-e'name=[^,]*'-o
,其中
-o
意味着只打印出行的匹配部分,从而更优雅地完成同样的事情。在SuSE11上进行了尝试,不确定bash版本是什么。第一个版本不显示输出,第二个版本继续运行,不退出。请参阅Glenn对其答案的评论(这比我的答案更简单、更好)。您的输入来自哪里--一个文件,存储在shell变量中,或者其他什么?当我运行这个时,我没有得到任何输出…您需要提供一些输入。试试
grep-o'name=[^,]\+'
grep -o 'name=[^ ,]\+'