2017-06-22 10 views
1

Hallo, Ich habe Problem versucht, sed zu verwenden, um eine sehr große Datei für eine specfic Zeichenfolge zu suchen und das mittlere Feld zu extrahieren, ist hier, was ich versucht hatte:sed suchen und spezifisches Feld extrahiert mit regex

zum Beispiel , ich bin auf der Suche nach der Zeichenfolge $BBB.*,55

sed -n '/^$BBB.*,\b55\b/p', 

dies die spezifische Linie zurückkehren würde, aber wie zwicken ich die Regex nur die JOB1 daraus zu extrahieren? schätzen irgendeine Art Beratung

$AAA.JOB1,15 

$AAA.JOB6,25 

$BBB.JOB1,55 # I want to extract JOB1 from this line 

$BBB.JOB2,59 

CCC.CPU1,16 

CCC.CPU4,18 

Antwort

2

Zunächst einmal müssen Sie \$ verwenden, da $ ein metacharacter in regex ist; Und dann können Sie capture group verwenden, um zu behalten, was Sie wollen. Versuchen Sie, diese für GNU sed:

$ cat test.txt 
$AAA.JOB1,15 
$AAA.JOB6,25 
$BBB.JOB1,55 
$BBB.JOB2,59 
CCC.CPU1,16 
CCC.CPU4,18 
$ sed -nr 's/^\$BBB\.([^,]*),55/\1/p' test.txt 
JOB1 
+0

Es ist auch erwähnenswert, dass '\ 1' in der * replace * -Zeichenfolge normalerweise als * back reference * bezeichnet wird, was das wiederherstellt, was von Ihrer * Capture-Gruppe * im * find * -Teil der' sed'-Substitution festgehalten wird. (Sie können mehrere Capture-Gruppen und * Backreferenzen * in der Reihenfolge verwenden, z. B. '\ 1',' \ 2', ...) –

2

Wenn Sie JOB1 extrahieren möchten aus gesucht $ BBB.JOB1,55. Sie können awk verwenden,

$ awk -F[.,] '/\$BBB.*,55/{print $2}' test.txt 
JOB1 

Wenn die Muster, die Sie auf Variablen zugewiesen suchen möchten, verwenden Sie Methoden wie folgt,

$ var1=$BBB 
$ var2=55 
$ awk -F[.,] -v v=$var1".*,"$var2 '$0 ~ v{print $2}' test.txt 
JOB1 
+0

das funktioniert! Danke vielmals. Side Track hier, ich versuche, das funktioniert in Bash Shell. wo "$ BBB" und "55" eine Variable ist; sag var1 = "$ BBB" und var2 ist "55". awk variable Substitution in Regex macht mich verrückt, mit der empfohlenen Methode über die -V; hier ist geht awk -F []., -v v1 = "$ var1" -v v2 = "$ var2" '/\v1.*,v2/{print $ 2}' test.txt, aber es hat nicht funktioniert aber ich habe versucht, irgendwelche Hinweise hier ??? – user3330821

+0

@ user3330821, sehen Sie meine Antwort für Ihre weitere Anfrage. – CWLiu

0

mit grep:

grep -Po "(?<=\.)([^\.]*[^,])(?=,)" filename 

Ausgabe:

JOB1 
JOB6 
JOB1 
JOB2 
CPU1 
CPU4