AWK-从git status命令解析第二列

时间:2018-07-21 10:40:22

标签: git awk

我需要从上面的输出中解析出第二列-问题是,如果文件名包含空格并且用引号引起来。

命令:

$ git status -u -s

输出:

 D README.md
 D mail/falover.sh
?? "ahh/Nov nnsdfd file.txt"
?? fremover.sh
?? mail/ahooooj
?? mail/awww
?? mail/file_test
?? mail/git.sh
?? mail/test

非常感谢!

6 个答案:

答案 0 :(得分:1)

如果您只需要具有"的行,并且您需要第二个字段表示从""的值,那么下面的内容可能会对您有所帮助。

your_command | awk 'match($0,/".*"/){print substr($0,RSTART+1,RLENGTH-2)}'

如果您想在输出中有"且所有其他行(其中没有"的情况下打印文件名),那么以下内容可能会对您有所帮助。

your_command | awk 'match($0,/".*"/){print substr($0,RSTART+1,RLENGTH-2);next} 1'

答案 1 :(得分:1)

尝试使用-porcelain=2选项,该选项将删除双引号,以便以后您可以使用类似的代码:

$ git status --porcelain=2 | cut -d" " -f9-

请注意,如果要获取所有文件(包括未跟踪的文件)也要加引号,则此操作将仅返回跟踪的文件;

$ git status --porcelain | cut -c4-

可以使用awk

$ git status --porcelain | awk '{$1 = ""; print substr($0, 2)}'

它的工作原理是将第一列设置为"",然后打印整行$0,但使用substr删除用作定界符的空间。 (这将迫使awk使用空格作为新的定界符来重建整个记录$0-请在评论中查看@Ed Morton的解释,并https://stackoverflow.com/a/15475578/1135424

检查Porcelain Format Version 2

答案 2 :(得分:1)

取决于是否要保留引号:

$ sed -E 's/^ *[^ ]+ +//' file
README.md
mail/falover.sh
"ahh/Nov nnsdfd file.txt"
fremover.sh
mail/ahooooj
mail/awww
mail/file_test
mail/git.sh
mail/test

$ sed -E 's/^ *[^ ]+ +//; s/^"|"$//g' file
README.md
mail/falover.sh
ahh/Nov nnsdfd file.txt
fremover.sh
mail/ahooooj
mail/awww
mail/file_test
mail/git.sh
mail/test

如果您的sed通过-E不支持ERE,则:

$ sed 's/^ *[^ ]* *//; s/^"|"$//g' file
$ sed 's/^ *[^ ]* *//; s/^"//; s/"$//' file

请注意,在某些极端情况下,该操作将失败,即您的文件名以引号引起来(以UNIX文件名允许)。如果可能发生,请在您的问题中告诉我们,并将其包含在示例输入/输出中。

答案 3 :(得分:1)

不必git status计算状态,然后从输出中抓取状态,而是使用git ls-files -ogit ls-files -o --exclude-standard简单地直接列出您想要的文件。

答案 4 :(得分:0)

如果您实际上不需要使用awk,那么简单的cut就足够了:

git status -u -s | cut -d" " -f2-

-d" "设置空格作为定界符,-f2-选择除第一个字段外的每个字段

答案 5 :(得分:0)

git status -u -s | awk -F '/' '{gsub("\"","");print $NF}'  

如果我正确理解了问题