Ich habe folgende Ausgabe von git status
, wie mache ich das grep
für alles nach 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]$
So, aber ohne Angabe der Anzahl der Zeilen, wie der -A
Parameter in 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]$
Gibt es eine Möglichkeit, dies zu tun?
[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
quelle
quelle
-A
mit einer ausreichend großen Zahl als Argument verwenden?Antworten:
Mit GNU
grep
(getestet mit Version 2.6.3):Verwendet
-P
für reguläre Perl-Ausdrücke,-z
um auch Zeilenumbrüche mit dem Muster abzugleichen\n
und-o
nur das zu drucken, was dem Muster entspricht.Der Regex erklärte :
Zuerst vergleichen wir ein beliebiges Zeichen (
.
) null oder mehrmals (*
), bis die Zeichenfolge vorkommtUntracked files
. Jetzt entspricht der Teil in den Klammern einem(.*\n)
beliebigen Zeichen mit Ausnahme einer neuen Zeile (.
), die null oder mehrmals (*
) gefolgt von einer neuen Zeile (\n
) ist. Und all das (das ist in den Backets) kann null oder mehrmals vorkommen; Das ist die Bedeutung des Letzten*
. Nach dem ersten Auftreten von sollte es nun mit allen anderen Zeilen übereinstimmenUntracked files
.quelle
grep
, ich bin beeindruckt!grep
ist das nicht das richtige Werkzeug. Aber ansonsten ist diese Frage (glaube ich) für den Benutzer nur die relevante Ausgabe zu sehen, was Sie offensichtlich bei 8000+ Zeilen nicht haben,grep
ed oder nicht.grep -A999999999 'Untracked files'
mit 1000000 Zeilen vor dem Match und 1000000 Zeilen nach dem Match getestet . Dieser Ansatz hat gut funktioniert.grep
Kann es also tun. Das Problem bei Ihrer Vorgehensweise besteht darin, dass Sie eine einzelne Übereinstimmung für die gesamte Datei und nicht für einzelne Zeilen erzwingen.Wenn es Ihnen nichts ausmacht, sed zu verwenden, finden Sie hier eine mögliche Lösung
quelle
Ich würde dafür verwenden
awk
:Dies
/Untracked files/,0
ist ein Bereichsausdruck. Er wertet True aus der ersten ZeitUntracked files
und bis0
True ergibt . Da dies niemals geschieht, wird der Rest der Datei gedruckt.Beachten Sie, dass
awk
das Verhalten von True das Drucken des aktuellen Datensatzes (normalerweise Zeile) ist. Aus diesem Grund müssen wir nicht explizit aufrufenprint
.quelle
Sie können versuchen:
wo
-A
würde Zeilen mit nachgestellten Kontext nach dem Spiel drucken.Alternativ verwenden Sie
more
oderless
, zum Beispiel:Für Skriptzwecke würde ich
ex
/ verwendenvi
:Verwenden Sie anstelle von, um eine Zeile mit nicht verfolgten Dateien einzuschließen .
kd1G
d1G
Oder ohne Verrohrung und
/dev/stdin
würde die Syntax sein:ex ... <(git status)
.quelle
-A
in meine ursprüngliche Frage aufgenommen, aber ich mag einenmore +/Untracked
Teil Ihrer Antwort.ex
der dies äquivalent istvi -e
.more
/less
ist sehr nützlich)Wenn ein Einzeiler mit Klammern eine Unterschale erzeugt, vermeiden Sie, die Variablen beizubehalten:
Sie können einfach am Ende davon in alles hineinpfeifen, was Sie sonst noch damit tun müssen.
Oder Sie können es in einem beliebigen Shell-Skript verwenden
Ersetzen Sie das
echo "$LINE"
durch das, was Sie mit den Daten tun möchten. Wenn Sie die Zeile "Untracked files" überspringen möchten, wechseln Sie einfach die beiden Tests.quelle
Sie können so etwas verwenden, ich habe Perl verwendet, den folgenden Befehlssatz,
count = 1
wenn ich mit einer Zeichenfolge in der aktuellen Zeile übereinstimme, und wenn die while-Schleife abgeschlossen ist, überprüfe ich die Zählvariablen und drucke den Zeilenbereich aus, von dem die Übereinstimmung bis zum letzten erfolgt Liniequelle
perl -ne 'print if /Untracked files:/ .. 0'