如何从命令输出中获取第一行最后一个单词的值

时间:2018-07-20 07:03:45

标签: bash

我想从Mockito.initMocks(this)命令中检索版本号。 输出:

rsense -version

我尝试过的事情: 如果我将输出保存在一个文本文件中,请说output.txt并执行此命令 rsense version 0.5.18 Usage: rsense <start|stop|restart> 。我得到要求的结果,即awk 'NR == 1 {print $3}' /Users/poornima/Desktop/output.txt

但是 0.5.18不起作用。输出:

rsense -version | awk 'NR == 1 {print $3}'

2 个答案:

答案 0 :(得分:2)

我没有function ageCount() { var date1 = new Date(); var dob = document.getElementById("dob").value; var date2 = new Date(dob); var pattern = /^\d{1,2}\/\d{1,2}\/\d{4}$/; if (pattern.test(dob)) { var y1 = date1.getFullYear(); var y2 = date2.getFullYear(); var age = y1 - y2; document.getElementById("age").value = age; document.getElementById("age").focus (); return true; }else { alert("Invalid date format. Please Input in (dd/mm/yyyy) format!"); return false; } } ,但是某些程序将其版本号写入rsense,而不是stderr。试试:

stdout

rsense -version 2>&1 | awk 'NR == 1 {print $3}' 的含义:为文件流分配了编号,称为文件描述符(fds):

0为2>&1,默认情况下为键盘,重定向符号stdin<

1是0<,默认情况下是屏幕,重定向符号stdout>

2是1>,默认情况下(无缓冲)屏幕是重定向符号stderr

我们可以重定向到以2>为前缀的文件或另一个文件描述符(请参阅&)。

因此man dup2意味着将文件描述符2(stderr)重定向到文件描述符1(stdout)。这是因为管道2>&1仅将左侧的|连接到右侧的stdout –而不使用stdin(fd 2)。

这里是使用stderr数组而不是bash语言的替代方法(理论上,这应该更有效,因为它避免了加载和运行awk外部进程):< / p>

awk

顺便说一句,您的问题要求输入最后字。在a=($(rsense -version 2>&1)) echo ${a[2]} # arrays count from zero, awk counts from 1 中,应为:

bash
echo ${a[-1]} # assumes a recent version of bash 中的

为:

awk

awk '{print $NF}' 中,awk给出了字段数。

答案 1 :(得分:0)

使用标准的Unix文本处理工具,有几种方法可以实现相同的目标。

使用cut

rsense --version | head -n 1 | cut -f3 -d' '

head -n 1仅输出其输入的第一行。
cut -f3 -d' '输出3 rd f,使用空格(' '作为输入d分隔符(默认分隔符)是制表符)。

使用sed

rsense --version | sed -n "1s/^rsense version //p"

不再需要head -n 1,因为可以指示sed处理输入的哪几行。
"1s/^rsense version //p"sed程序。它告诉sed

  • 1-命令的其余部分仅适用于输入的第一行;
  • s/^rsense version //-s搜寻^rsense version并用空字符串替换(替换字符串在第二个和第三个/字符之间提供);
       搜索字符串是一个正则表达式; ^表示字符串的开头;搜索字符串的其余部分与输入字符串完全匹配;总而言之,此处提供的搜索字符串表示rsense version在行首” (请注意version之后的空格字符)。
  • p-p替换后将其删除。

-n告诉sed不要打印其输入(默认情况下,这是这样工作的)。除非使用p命令特别要求(除非我们只打印第1 st 行),否则这将抑制任何输出。

使用bash数组

a=($(rsense --version | head -n 1))
echo ${a[2]}

通过将命令包装在$()中,将捕获并使用其输出来代替命令。执行rsense --version | head -n 1之后,第一行与a=(rsense version 0.5.18)相同。
文本周围的花括号创建一个bash数组。每个作品都是数组中的一个条目。数组从0开始进行数字索引。文本的第三个单词成为索引2上的值。
${a[2]}是数组a中存储在索引2处的值(在这种情况下为所需的版本号)。