如何在Shell脚本中存储和解析`Git Status`的输出

时间:2019-01-22 01:20:37

标签: bash python-2.7 shell

如何通过分支名称进行解析,以便可以提取分支名称以进行进一步处理?

branchname=$(git status 2>&1) 

解析branchname以提取另一个变量中的test_pbx_voice_chanls_e1_WIP

从下面显示的输出中,我尝试提取“ On branch”之后的名称,以供脚本中的其他步骤使用。

在提示符下输出:

  

testing @ test:〜/ linuxprompt-test $ git status
  在分支上test_pbx_voice_chanls_e1_WIP
  您的分支机构的最新信息是'origin / test_pbx_voice_chanls_e1_WIP'

2 个答案:

答案 0 :(得分:1)

您可以使用git statussed来解析分支名称:

$ branchname=$(git status 2> /dev/null | sed -e '/^[^O]/d' -e 's/On branch \(.*\)/\1/') | sed -e ':a;N;$!ba;s/\n//g'
$ echo ${branchname}

第一个sed将删除不带“分支上”的行,然后删除其余行上的“分支上”。

  • -e告诉sed将下一个参数作为编辑命令。

  • ^[^O]将匹配所有开头没有“ O”的行,而/d将删除它们。

  • s/On branch \(.*\)/\1/将用任何其他字符.*跟随的“在分支”上替换为第一个\1括号出现位置\(和{{ 1}}。

  • 您可以在gnu.org

  • 上详细了解 s (替代)命令。

第二个\)删除前一个sed -e ':a;N;$!ba;s/\n//g'引入的尾随LF(x0A)。这将循环读取文本流,然后删除换行符。

  • sed创建标签。
  • :a将当前行和下一行追加到模式空间。
  • N不要在最后一行做(我们需要一个最后的换行符)
  • $!分支到创建的标签。
  • ba用任何换行符替换任何内容。

因此,公平地说,仅使用s/\n//ggit status不会产生更简单的解决方案。

答案 1 :(得分:0)

在bash中,您可以使用headcut的简单组合:

$ git status
On branch test_pbx_voice_chanls_e1_WIP
Your branch is up-to-date with 'origin/test_pbx_voice_chanls_e1_WIP'

使用head命令获取第一行

$ git status | head -n1
On branch test_pbx_voice_chanls_e1_WIP

  • head -nX将根据提供的输入从开头(也就是头)返回X

获取第三个单词,该单词始终是分支名称:

$ git status | head -n1 | cut -d" " -f3
test_pbx_voice_chanls_e1_WIP
  • -d" "cut的输入用" "(空格)分割为字符串数组
  • -f3将返回该数组的 3rd 字段

将输出分配给变量,并可能丢弃错误消息(2>/dev/null):

$ branchname=$(git status 2>/dev/null | head -n1 | cut -d" " -f3)
$ echo ${branchname}
test_pbx_voice_chanls_e1_WIP