it-swarm.com.de

Drucken Sie ein bestimmtes Teil in einer Ausgabe

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"

Nun ist meine Frage: Gibt es irgendwelche Befehle, die nur das ausgeben, was sich in den Anführungszeichen befindet, d. H. " "?

Und können Sie bitte den Befehl etwas erläutern? Danke! im Voraus.

11
Raphael

Ja, das kannst du. Ihr Befehl wäre:

cat /boot/config-3.19.0-32-generic | grep CONFIG_Arch_DEFCONFIG | awk -F'"' '{print $2}'

was nur zurückkehren würde:

Arch/x86/configs/x86_64_defconfig

Der Befehl awk verwendet Feldtrennzeichen mit dem Befehl -F. Um doppelte Anführungszeichen zu verwenden, geben Sie einfache Anführungszeichen wie -F'"' ein. Dann weist '{print $2}' awk an, den zweiten Satz nach dem Feldtrennzeichen zu drucken.

Hoffe das hilft!

15
Terrance

Sie können dies mit einem einzigen grep Befehl tun:

grep -Po '^CONFIG_Arch_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

Oder (ein bisschen länger und beschwerter):

grep -Po '^CONFIG_Arch_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: Weist grep an, das Muster als PCRE (Perl Compatible Regular Expression) zu interpretieren.
  • -o: Weist grep an, nur die Übereinstimmung zu drucken;
  • ^CONFIG_Arch_DEFCONFIG=": Entspricht einer CONFIG_Arch_DEFCONFIG=" Zeichenfolge am Zeilenanfang;
  • \K: Verwirft die zuvor übereinstimmende Teilzeichenfolge.

# 1:

  • [^"]*: Stimmt mit einer beliebigen Anzahl von Zeichen überein, die nicht " sind (gierig).

# 2:

  • .*?: Stimmt mit einer beliebigen Anzahl von Zeichen überein (träge);
  • (?="): lookahead (Behauptung ohne Länge, es stimmt mit keinem Zeichen überein); trifft zu, wenn das folgende Zeichen ein " ist.
% grep -Po '^CONFIG_Arch_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
Arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_Arch_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
Arch/x86/configs/x86_64_defconfig
11
kos

Es gibt viele Möglichkeiten, diese Katze zu häuten. Hier ist ein sed Weg:

sed -nr 's/^CONFIG_Arch_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

Hier passen wir die Zeile an und erfassen den gewünschten Teil, d. H. Den Teil in doppelten Anführungszeichen (([^"]+)) und ersetzen dann die gesamte Zeile durch die erfasste Gruppe (\1).

Beispiel:

% sed -nr 's/^CONFIG_Arch_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
Arch/x86/configs/x86_64_defconfig
10
heemayl

Was, nein Perl?

grep CONFIG_Arch_DEFCONFIG /boot/config-3.19.0-32-generic | 
    Perl -pe 's/.*?"([^"]*).*/$1/'

Das Perl wird -p jede Zeile drucken, nachdem das von -e gegebene Skript angewendet wurde. Der s/foo/bar/ ersetzt foo durch bar. Muster in Klammern werden "erfasst" und können als $1, $2 ... $N bezeichnet werden, wobei $1 das erste erfasste Muster ist, $2 Sekunden usw. Der reguläre Ausdruck sucht nach allem bis zum ersten Anführungszeichen (.*?"), erfasst dann 0 oder mehr Nicht-" -Zeichen ([^"]*) und dann alles andere. Das Ganze wird durch das erfasste Muster ersetzt.

Sie können die Musterübereinstimmung auch auf Perl belassen:

Perl -ne 's/.*CONFIG_Arch_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic
10
terdon

Hier ist eine Kombination aus grep und cut, die den gleichen Job macht.

$ grep "CONFIG_Arch_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
Arch/x86/configs/x86_64_defconfig

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 Stufe
  • cut -d"\"" -f2. In diesem Teil wird ausgeschnittener Text verwendet, der durch ein bestimmtes Trennzeichen (das mit dem Flag -d angegeben wird) getrennt ist. Wir müssen das doppelte Anführungszeichen mit Backslash umgehen, damit Shell das doppelte Anführungszeichen als eine der Optionen für den Befehl cut zulässt, anstatt Eingaben in die Shell selbst vorzunehmen. Jetzt behandelt cut die Ausgabe von grep als durch " getrennt und in drei Spalten aufgeteilt, CONFIG_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.
8

Da ich gerade python lerne, ist hier eine Version, die genau das verwendet.

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_Arch_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

Probelauf:

DIR:/TECH-BOOKS
[email protected]:$ ./extractString.py                                           
Arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
[email protected]:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_Arch_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]
3