Drucken eines bestimmten Teils in einer Ausgabe

11

Nehmen wir an, es gibt einen Befehl wie:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

Die Ausgabe ist wie folgt:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

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

Und könnten Sie den Befehl bitte ein wenig erläutern? Vielen Dank! im Voraus.

    
Raphael 25.12.2015, 07:00
quelle

6 Antworten

15

Ja, das können Sie tun. Ihr Befehl wäre:

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

was nur zurückgeben 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 ihn in einfache Anführungszeichen wie -F'"' ein. Dann sagt der Befehl '{print }' awk, dass der zweite Satz nach dem Feldtrennzeichen gedruckt werden soll.

Ich hoffe, das hilft!

    
Terrance 25.12.2015, 07:17
quelle
11

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

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

Oder (etwas länger und ermutigter):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P : weist grep an, das Muster als PCRE (Perl-kompatibler regulärer Ausdruck) zu interpretieren;
  • -o : Gibt grep an, nur den Treffer auszudrucken;
  • ^CONFIG_ARCH_DEFCONFIG=" : Stimmt mit einer Zeichenfolge von CONFIG_ARCH_DEFCONFIG=" am Zeilenanfang überein;
  • \K : verwirft den zuvor übereinstimmenden Teilstring;

# 1:

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

# 2:

  • .*? : Entspricht einer beliebigen Anzahl beliebiger Zeichen (faul);
  • (?=") : Lookahead (Annahme mit Nulllänge, es stimmt mit keinem Zeichen überein); stimmt überein, 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
    
kos 25.12.2015 09:51
quelle
10

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

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$//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 nur durch die erfasste Gruppe ( ).

Beispiel:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$//p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig
    
heemayl 25.12.2015 12:20
quelle
10

Was, kein perl ?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*//'

Die perl werden nach dem Anwenden des von -p angegebenen Skripts jede Zeile um -e rint. s/foo/bar/ wird foo durch bar ersetzen. Muster in Klammern werden "erfasst" und können als , ... $N bezeichnet werden, wobei das erste erfasste Muster ist, das zweite usw. Der reguläre Ausdruck sucht nach allem bis zum ersten Anführungszeichen ( .*?" ), dann 0 oder mehr Nicht- " -Zeichen ( [^"]* ) und dann alles andere erfassen. Das Ganze wird durch das erfasste Muster ersetzt.

Sie können das Muster auch in perl :

belassen
perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*// && print' /boot/config-3.19.0-32-generic
    
terdon 25.12.2015 15:21
quelle
8

Hier ist eine Kombination aus grep und cut , die dieselbe Aufgabe erfüllt.

$ 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-Syntax von grep findet: grep [OPTIONS] PATTERN [FILE...] . Die Ausgabe geht durch die Pipe zur nächsten Stufe
  • cut -d"\"" -f2 . In diesem Teil wird Text abgeschnitten, der durch ein bestimmtes Trennzeichen getrennt wird (das mit dem Flag -d angegeben ist). Wir müssen das doppelte Anführungszeichen mit einem Backslash umgehen, sodass es in der Shell möglich ist, doppelte Anführungszeichen als Option für den Befehl cut zu verwenden, anstatt in die Shell selbst einzugeben. Jetzt wird cut die Ausgabe von grep als von " getrennt behandeln und in drei Spalten, CONFIG_ARCH_DEFCONFIG , arch/x86/configs/x86_64_defconfig , und Leerzeichen aufteilen. Die Zeile, die wir brauchen, ist die zweite Spalte. Das bedeutet, dass wir das Flag -f2 verwenden müssen.
Sergiy Kolodyazhnyy 25.12.2015 07:52
quelle
3

Da ich gerade lerne, python hier zu lernen, ist 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
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ 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]
    
Sergiy Kolodyazhnyy 22.01.2016 03:30
quelle

Tags und Links