Shell 将动态更改的字符串存储到变量中

Shell 将动态更改的字符串存储到变量中,shell,awk,sed,Shell,Awk,Sed,我是一名全新的unix in-shell脚本编写人员,因此我想我需要有关以下问题的帮助: 我想将动态变化的日志文本字符串存储到变量中。E.x一次运行创建此日志的程序时,此字符串可能为server1,下一次为server238。我已经找到了通过sed或grep和cut查找该字符串第一次出现的方法。但是,由于此软件创建的日志文件可能因版本而异,因此我无法计算包含此字符串的特定行。E.x一个版本可能会记录“您使用的服务器是server98”,下一个版本可能会记录“使用的服务器是server98”。是否

我是一名全新的unix in-shell脚本编写人员,因此我想我需要有关以下问题的帮助:

我想将动态变化的日志文本字符串存储到变量中。E.x一次运行创建此日志的程序时,此字符串可能为server1,下一次为server238。我已经找到了通过sed或grep和cut查找该字符串第一次出现的方法。但是,由于此软件创建的日志文件可能因版本而异,因此我无法计算包含此字符串的特定行。E.x一个版本可能会记录“您使用的服务器是server98”,下一个版本可能会记录“使用的服务器是server98”。是否有一种方法可以通过sed或awk检索此字符串,而不考虑日志布局。 提前谢谢

试试这个:

MY_VAR="$(sed -n 's/^.*\(server[0-9][0-9]*\).*$/\1/p' my_file.log | sort -u)"
我同意:

server=$(grep -Eo 'server[0-9]+' file | head -n 1)
查找单词
server
后跟一些数字的任何匹配项,例如server3、server98

-E
表示使用扩展正则表达式(即多个数字的.\d+)

-o
表示只输出字符串的匹配部分,而不是包含该字符串的整行

以下是它在OSX上的作用:

cat file
server9 
fred server98 fred
3

/usr/bin/grep -Eo 'server[0-9]+' file
server9
server98

哦,你好像很喜欢!很好。那太残忍了,@devnull:-)@MarkSetchell先生那有什么残忍的?这本书读得很好。@devnull哦,好吧,我误解了。谢谢你的快速回复。我试过了,但是变量是空的。你能解释一下参数-Eo代表什么吗?因为我在任何引用中都没有找到它。我也尝试了grep-E,但是变量也是空的。我已经解释了我使用的开关。它们是OSX下Mac上的那些,但是如果您使用
man grep
,然后使用
/xtended
,您应该能够在任何Unix/Linux上找到相应的。事实上,我认为Linux使用GNU grep,它无论如何都会扩展正则表达式,所以你可以在Linux上省略它。我也试过只使用grep-o,但还是一样。我可能误解了什么。这是有效的,但它存储了server91的所有事件。如何将此最小化为一个呢?我已经修改了我的答案,通过使用
head-n1
获得第一个答案。变量的回音显示它存储了所有事件,但只存储了数字。所以它存储了下面的91,我可能会被误解,但我只希望整个字母数字“server91”存储在变量中。