wake-up-neo.net

Shell-Skript: So schneiden Sie einen Teil einer Zeichenfolge

Ich habe folgende Zeichenfolge

â   â³ eGalax Inc. USB TouchController          id=9    [slave  pointer  (2)]
â   â³ eGalax Inc. USB TouchController          id=10   [slave  pointer  (2)]

und möchte die id-liste bekommen? Wie geht das mit sed oder etwas anderem? 

12
deimus

Ich habe den Inhalt Ihres Beispiels in eine Datei mit dem Namen so.txt eingefügt.

$ cat so.txt | awk '{ print $7 }' | cut -f2 -d"="
9
10

Erläuterung:

  1. cat so.txt druckt den Inhalt der Datei in stdout
  2. awk '{ print $7 }' druckt die siebte Spalte, d. h. die Spalte, die id=n enthält. 
  3. cut -f2 -d"=" schneidet die Ausgabe von Schritt # 2 mit = als Trennzeichen und ruft die zweite Spalte (-f2) auf.

Wenn Sie lieber auch id= bekommen, dann:

$ cat so.txt | awk '{ print $7 }' 
id=9
id=10
31
Manoj Govindan

Verwenden Sie einen regulären Ausdruck, um die ID-Nummer abzufangen und die gesamte Zeile durch die Nummer zu ersetzen. So etwas sollte es tun (passt alles auf "id =" an, passt dann auf eine beliebige Anzahl von Ziffern und passt dann auf den Rest der Zeile)

sed -e 's/.*id=\([0-9]\+\).*/\1/g'

Tun Sie dies für jede Zeile und Sie erhalten die Liste der IDs.

3
bluebrother

Eine Perl-Lösung:

Perl -nE 'say $1 if /id=(\d+)/' filename
2
sid_com
$ Ruby -ne 'puts $_.scan(/id=(\d+)/)' file
9
10
2
ghostdog74

Sie können awk alles tun, ohne cut zu verwenden:

awk '{print substr($7,index($7,"=")+1)}' inputfile

Sie könnten split() anstelle von substr(index()) verwenden.

1

Annahme von Eingabe von

{Anything}id={ID}{space}{Anything} 
{Anything}id={ID}{space}{Anything}

-

#! /bin/sh
while read s; do
   rhs=${s##*id=}
   id=${rhs%% *}
   echo $id # Do what you will with $id here
done <so.txt 

Oder wenn es immer das 7. Feld ist

#! /bin/sh
while read f1 f2 f3 f4 f5 f6 f7 rest
do
echo ${f7##id=}
done <so.txt

Siehe auch

Shell-Parametererweiterung

0
frayser