Tengo el siguiente resultado de git status
, ¿cómo hago grep
para todo después 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]$
Así, pero sin especificar el número de líneas, como el -A
parámetro en 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]$
¿Hay una manera de hacerlo?
[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]$
command-line-interface
grep
alexus
fuente
fuente
-A
un número lo suficientemente grande como argumento?Respuestas:
Con GNU
grep
(probado con la versión 2.6.3):Se utiliza
-P
para expresiones regulares perl,-z
para coincidir también con la nueva línea\n
e-o
imprimir solo lo que coincide con el patrón.La expresión regular explicó :
Primero hacemos coincidir cualquier carácter (
.
) cero o varias veces (*
) hasta que ocurra la secuenciaUntracked files
. Ahora, la parte dentro de los corchetes(.*\n)
coincide con cualquier carácter, excepto una nueva línea (.
) cero o varias veces (*
) seguido de una nueva línea (\n
). Y todo eso (que está dentro de los backets) puede ocurrir cero o varias veces; Ese es el significado de lo último*
. Ahora debería coincidir con todas las demás líneas, después de la primera aparición deUntracked files
.fuente
grep
, ¡estoy impresionado!grep
no es la herramienta correcta. Pero de lo contrario, esta pregunta es (creo) para que el usuario vea solo la salida relevante, lo que obviamente no tiene en más de 8000 líneas,grep
ed o no.grep -A999999999 'Untracked files'
con 1000000 líneas antes del partido y 1000000 líneas después del partido. Ese enfoque funcionó bien. Entoncesgrep
puede hacerlo. El problema con su enfoque es que lo está obligando a realizar una sola coincidencia en todo el archivo en lugar de en líneas individuales.Si no te importa usar sed, aquí hay una posible solución
fuente
Yo usaría
awk
para esto:Esta
/Untracked files/,0
es una expresión de rango. Se evalúa como verdadero desde la primera vezUntracked files
y hasta0
evalúa como verdadero. Como esto nunca sucede, imprime el resto del archivo.Tenga en cuenta que
awk
el comportamiento de un Verdadero es imprimir el registro actual (línea, normalmente), es por eso que no tenemos que llamar explícitamenteprint
.fuente
Puedes probar:
donde
-A
imprimiría líneas de contexto final después del partido.Alternativamente, use
more
oless
, por ejemplo:Para fines de secuencias de comandos, usaría
ex
/vi
:Para incluir una línea con archivos sin seguimiento , use en
kd1G
lugar ded1G
.O sin tubería y
/dev/stdin
, la sintaxis sería:ex ... <(git status)
.fuente
-A
en mi pregunta original, pero me gustamore +/Untracked
parte de su respuesta.ex
cual es equivalentevi -e
.more
/less
es muy útil)Para una línea con paréntesis para generar una subshell para evitar retener las variables:
Simplemente puede canalizar al final de eso en cualquier otra cosa que necesite hacer con él.
O puede usarlo en cualquier script de shell
Reemplace el
echo "$LINE"
con lo que quiera hacer con los datos. Si desea omitir la línea "Archivos no rastreados", simplemente cambie las dos pruebas.fuente
puede usar algo como esto, usé Perl, el siguiente conjunto de comandos
count = 1
si hago coincidir alguna cadena en la línea actual y cuando el ciclo while finaliza, verifico las variables de conteo e imprimo el rango de líneas desde el lugar donde coinciden hasta el último líneafuente
perl -ne 'print if /Untracked files:/ .. 0'