我有从git status下面的输出,我怎么在未Untracked files后grep的一切:
[alexus@wcmisdlin02 Test]$ git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: app/.gitignore # new file: app/app.iml # new file: app/build.gradle # new file: app/proguard-rules.pro # new file: app/src/androidTest/java/org/alexus/test/ApplicationTest.java # new file: app/src/main/AndroidManifest.xml # new file: app/src/main/java/org/alexus/test/MainActivity.java # new file: app/src/main/res/layout/activity_main.xml # new file: app/src/main/res/menu/menu_main.xml # new file: app/src/main/res/mipmap-hdpi/ic_launcher.png # new file: app/src/main/res/mipmap-mdpi/ic_launcher.png # new file: app/src/main/res/mipmap-xhdpi/ic_launcher.png # new file: app/src/main/res/mipmap-xxhdpi/ic_launcher.png # new file: app/src/main/res/values-w820dp/dimens.xml # new file: app/src/main/res/values/dimens.xml # new file: app/src/main/res/values/strings.xml # new file: app/src/main/res/values/styles.xml # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # .gitignore # .idea/ # Test.iml # build.gradle # gradle.properties # gradle/ # gradlew # gradlew.bat # settings.gradle [alexus@wcmisdlin02 Test]$
像这样,但没有指定行数,例如GNU grep的-A参数:
[alexus@wcmisdlin02 Test]$ git status | grep -A100 'Untracked files' # Untracked files: # (use "git add <file>..." to include in what will be committed) # # .gitignore # .idea/ # Test.iml # build.gradle # gradle.properties # gradle/ # gradlew # gradlew.bat # settings.gradle [alexus@wcmisdlin02 Test]$
有没有办法做到这一点?
[alexus@wcmisdlin02 Test]$ grep --version grep (GNU grep) 2.20 Copyright (C) 2014 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>. [alexus@wcmisdlin02 Test]$
GNU grep (使用2.6.3版本testing):
git status | grep -Pzo '.*Untracked files(.*\n)*'
使用-P为perl正则expression式, -z还将换行符与\n和-o匹配,以仅打印与该模式匹配的内容。
正则expression式解释说 :
首先我们匹配任何字符( . )零次或多次( * ),直到出现stringUntracked files 。 现在,括号(.*\n)匹配换行符( . )零或多次( * )之后的任何字符,后跟换行符( \n )。 而所有这些(在篮筐里面)可能会出现零次或多次。 这是最后一个*的含义。 它现在应该匹配所有其他行,在第一次发生Untracked files 。
如果你不介意使用sed,这是一个可能的解决scheme
git status | sed -n -e '/Untracked files/,$p'
你可以尝试:
git status | grep -A99 Untracked
其中-A会在匹配之后打印结尾的上下文的行。
或者使用less ,例如:
git status | less +/Untracked
为了脚本的目的,我会使用ex / vi :
git status | ex -s +"/Untracked/norm d1G" +%p -cq! /dev/stdin
要包含未跟踪文件的行 ,请使用kd1G而不是d1G 。
或者没有pipe道和/dev/stdin ,语法是: ex ... <(git status) 。
我会用这个awk :
git status | awk '/Untracked files/,0'
这个/Untracked files/,0是一个范围扩展。 它从第一次Untracked files评估为True,直到0评估为True。 由于这从来没有发生,所以它打印文件的其余部分。
注意, awk对True的行为是打印当前logging(通常是行),这就是为什么我们不必显式调用print 。
对于带括号的单引号来产生一个子shell,所以你避免保留这些variables:
(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \ [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))
你可以把它的末尾转换成你需要做的任何事情。
或者你可以在任何shell脚本中使用它
while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 [[ "$MATCHED" = 1 ]] && echo "$LINE" done < <(git status)
将echo "$LINE"replace为您想对数据执行的任何操作。 如果你想跳过“Untracked files”这一行,那么只需要切换两个testing。
你可以使用像这样的东西,我使用Perl,下面的命令set count = 1如果我匹配当前行中的一些string和while循环完成时,我检查计数variables,我打印从匹配发生的地方行的范围到最后一行
ls -al | perl -e '@LINES = (); $n = 0 ; $nline = 0; while(<>){ push(@LINES, $_); $n++; if($_ =~ m/mirror/i) { $count = 1; $nline = $. - 1 };}; if($count != 0){ foreach $i($nline..$n-1){ print "\t$LINES[$i]\n";}}'