Nehmen wir an, es gibt einen Befehl wie:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
Die Ausgabe ist als solche:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Meine Frage lautet nun: Gibt es Befehle, die nur das drucken, was sich in den Anführungszeichen befindet, dh " "
?
Und könnten Sie bitte den Befehl ein wenig erklären? Vielen Dank! im Voraus.
command-line
text-processing
Raphael
quelle
quelle
cat
in einem Rohr fast immer eine Verschwendung von Ressourcen darstellt (AKA UUOC ).grep
kann seine Eingabe bereits aus einer Datei lesen (dhgrep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
genau das Gleiche tun, aber 1. Es ist kürzer 2. Es ist leichter zu verstehen 3. Es gibt keine zusätzliche Shell und keinen zusätzlichen Prozess). In 99% der Fälle ist die Verwendung von cat am Anfang der Pipe ohne Verkettung mehrerer Dateien nur schädlich. :)cat
, obwohl in diesem Fall nutzlos, würde das Bearbeiten der gesamten Befehlszeile in Zukunft erleichtern, falls Sie später etwas ändern / hinzufügen / entfernen möchten, vielleicht eintr
odercut
usw., müssen Sie den Dateinamen nicht finden und verschieben Stellen Sie sicher, dass der andere Befehl ihn unterstützt, finden Sie heraus, wo er abgelegt werden soll usw. Für eine kleine Testdatei werden nur 0,002 Sekunden hinzugefügt. (Ich habe wahrscheinlich mehr Zeit damit verbracht, dies zucat
cat
hier? Sie könnengrep foo file | tr
oder... | cut
genauso einfach wiecat file | tr | grep ...
. Dascat
fügt nur zusätzliche fünf Zeichen, eine zusätzliche Pipe und einen zusätzlichen Programmaufruf hinzu und vereinfacht nichts.Antworten:
Ja, das kannst du machen. Ihr Befehl wäre:
was nur zurückkehren würde:
Der
awk
Befehl verwendet Feldtrennzeichen mit dem-F
Befehl. Um die Verwendung von doppelten Anführungszeichen festzulegen, geben Sie ihn wie folgt in einfache Anführungszeichen ein-F'"'
. Dann'{print $2}'
weist awk an, den zweiten Satz nach dem Feldtrennzeichen zu drucken.Hoffe das hilft!
quelle
cat
undgrep
. Sie könnten ersetzencat
undgrep
trennen mitawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Weniger Klempnerarbeiten, damit AWK die ganze Arbeit erledigen kann, zu der es mehr als fähig istawk
Befehls erweitert. =)Sie können dies mit einem einzigen
grep
Befehl tun :Oder (etwas länger und konvultierter):
-P
: weistgrep
an, das Muster als PCRE (Perl Compatible Regular Expression) zu interpretieren;-o
: weistgrep
an, nur die Übereinstimmung zu drucken;^CONFIG_ARCH_DEFCONFIG="
: Entspricht einerCONFIG_ARCH_DEFCONFIG="
Zeichenfolge am Zeilenanfang.\K
: verwirft den zuvor übereinstimmenden Teilstring;# 1:
[^"]*
: Entspricht einer beliebigen Anzahl von Zeichen, die nicht"
(gierig) sind.# 2:
.*?
: Entspricht einer beliebigen Anzahl von Zeichen (träge);(?=")
: lookahead (Behauptung ohne Länge, es passt zu keinem Zeichen); stimmt überein, wenn das folgende Zeichen a ist"
.quelle
Es gibt viele Möglichkeiten, diese Katze zu häuten. Hier ist eine
sed
Möglichkeit:Hier passen wir die Zeile an und erfassen den gewünschten Teil, dh den Teil in doppelten Anführungszeichen (
([^"]+)
), und ersetzen dann die gesamte Zeile nur durch die erfasste Gruppe (\1
).Beispiel:
quelle
Was, nein
perl
?Das
perl
wird-p
jede Zeile nach dem Anwenden des von-e
. Dass/foo/bar/
wird ersetztfoo
mitbar
. Muster in Klammern „eingefangen“ und können als bezeichnet werden$1
,$2
...$N
wo$1
ist das erste Muster erfaßt,$2
die zweiten usw. Der regulären Ausdruck für alles aussehen wird , bis das erste Zitat (.*?"
), dann fängt 0 oder mehr Nicht -"
Zeichen ([^"]*
) und dann alles andere. Das Ganze wird durch das erfasste Muster ersetzt.Sie können die Musterübereinstimmung auch wie folgt belassen
perl
:quelle
with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Hier ist eine Kombination von
grep
undcut
, die den gleichen Job macht.Erläuterung:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
ist der Teil, der die Zeile in der Standard-Grep-Syntax findet :grep [OPTIONS] PATTERN [FILE...]
. Der Ausgang geht durch die Leitung zur nächsten Stufecut -d"\"" -f2
. In diesem Teil wird ausgeschnittener Text verwendet, der durch ein bestimmtes Trennzeichen (das mit einem-d
Flag gekennzeichnet ist) getrennt ist. Wir müssen das doppelte Anführungszeichen mit Backslash umgehen, damit die Shell das doppelte Anführungszeichen als eine der Optionen für dencut
Befehl verwendet, anstatt es in die Shell selbst einzugeben. Nuncut
wird der Ausgang von behandelngrep
als getrennt durch"
und spaltete sich in drei SpaltenCONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
und leeren Raum. Die Zeile, die wir benötigen, ist die zweite Spalte, dh wir müssen das-f2
Flag verwenden.quelle
Da ich gerade
python
hier lerne , ist eine Version, die genau das verwendet.Probelauf:
quelle
line.startswith
weilre.match
es viel langsamer ist alsstartswith