grep linhas após o jogo até o final

9

Tenho a seguinte saída de git status , como faço para grep para tudo depois de Untracked files :

[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]$ 

Assim, mas sem especificar o número de linhas, como o parâmetro -A no GNU grep :

[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]$ 

Existe uma maneira de fazer isso?

[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]$ 
    
por alexus 29.05.2015 / 17:13

6 respostas

10

Com o GNU grep (testado com a versão 2.6.3):

git status | grep -Pzo '.*Untracked files(.*\n)*'

Usa -P para expressões regulares perl, -z também corresponde a nova linha com \n e -o para imprimir apenas o que corresponde ao padrão.

O regex explicado :

Primeiro, combinamos qualquer caractere ( . ) zero ou várias vezes ( * ) até uma ocorrência da string Untracked files . Agora, a parte entre parênteses (.*\n) corresponde a qualquer caractere, exceto uma nova linha ( . ) zero ou várias vezes ( * ) seguida por uma nova linha ( \n ). E tudo isso (dentro das backets) pode ocorrer zero ou várias vezes; esse é o significado do último * . Agora deve corresponder a todas as outras linhas, após a primeira ocorrência de Untracked files .

    
por 29.05.2015 / 18:26
11

Se você não se importa em usar sed, aqui está uma possível solução

git status | sed -n -e '/Untracked files/,$p'
    
por 29.05.2015 / 17:22
3

Eu usaria awk para isso:

git status | awk '/Untracked files/,0'

Este /Untracked files/,0 é uma extensão de intervalo. Ele é avaliado como Verdadeiro desde a primeira vez Untracked files e até que 0 seja avaliado como Verdadeiro. Como isso nunca acontece, imprime o restante do arquivo.

Observe que o comportamento de awk para um True é para imprimir o registro atual (linha, normalmente), é por isso que não precisamos chamar explicitamente print .

    
por 30.05.2015 / 12:46
2

Você pode tentar:

git status | grep -A99 Untracked

onde -A imprimiria as linhas do contexto à direita após a correspondência.

Como alternativa, use more ou less , por exemplo:

git status | less +/Untracked

Para fins de script, eu usaria ex / vi :

git status | ex -s +"/Untracked/norm d1G" +%p -cq! /dev/stdin

Para incluir a linha com Arquivos não rastreados , use kd1G em vez de d1G .

Ou sem canalização e /dev/stdin , a sintaxe seria: ex ... <(git status) .

    
por 29.05.2015 / 18:30
1

Para um one-liner com parêntese para gerar um subshell para evitar a retenção das variáveis:

(while read LINE ; do [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1 ; \
   [[ "$MATCHED" = 1 ]] && echo "$LINE" ; done < <(git status))

Você pode canalizar no final disso para o que mais precisar fazer com ele.

Ou você pode usá-lo em qualquer script de shell

while read LINE ; do
    [[ "$LINE" =~ "Untracked files" ]] && MATCHED=1
    [[ "$MATCHED" = 1 ]] && echo "$LINE"
done < <(git status)

Substitua o echo "$LINE" pelo que você deseja fazer com os dados. Se você quiser pular a linha "Untracked files", basta alternar os dois testes.

    
por 29.05.2015 / 17:50
0

você pode usar algo como isto, eu usei Perl, o seguinte conjunto de comandos count = 1 se eu combinar uma string na linha atual e quando o loop while terminar eu verifico as variáveis de contagem e imprimo o intervalo de linhas de onde a partida acontece na última linha

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";}}'
    
por 29.05.2015 / 18:22