2016-11-02 8 views
0

In Bash-Skript von der Ausgabe unten, muss ich die Zeilen zwischen "Device # 0" und "Device # 1" drucken, aber als all das ist Teil eines größeren Skript sollte ich Verwenden Sie Variablen für Start/Stop-Linien.Verwenden Sie Variablen in awk und/oder sed

---------------------------------------------------------------------- 
Physical Device information 
---------------------------------------------------------------------- 
     Device #0 
     Device is a Hard drive 
     State        : Online 
     Block Size       : 512 Bytes 
     Supported       : Yes 
     Programmed Max Speed    : SATA 6.0 Gb/s 
     Transfer Speed      : SATA 6.0 Gb/s 
     Reported Channel,Device(T:L)  : 0,0(0:0) 
     Reported Location     : Connector 0, Device 0 
     Vendor        : ATA 
     Model        : 

     Firmware       : 003Q 
     Serial number      : S2HTNX0H418779 
     World-wide name     : 5002538C402805A4 
     Reserved Size      : 265496 KB 
     Used Size       : 897129 MB 
     Unused Size      : 18327 MB 
     Total Size       : 915715 MB 
     Write Cache      : Enabled (write-back) 
     FRU        : None 
     S.M.A.R.T.       : No 
     S.M.A.R.T. warnings    : 0 
     Power State      : Full rpm 
     Supported Power States    : Full power,Powered off 
     SSD        : Yes 
     Temperature      : 39 C/ 102 F 
     NCQ status       : Enabled 
     ---------------------------------------------------------------- 
     Device Phy Information 
     ---------------------------------------------------------------- 
     Phy #0 
      PHY Identifier     : 0 
      SAS Address      : 30000D1701801803 
      Attached PHY Identifier   : 3 
      Attached SAS Address   : 50000D1701801800 
     ---------------------------------------------------------------- 
     Runtime Error Counters 
     ---------------------------------------------------------------- 
     Hardware Error Count    : 0 
     Medium Error Count     : 0 
     Parity Error Count     : 0 
     Link Failure Count     : 0 
     Aborted Command Count    : 0 
     SMART Warning Count    : 0 


Model, SSD 

---------------------------------------------------------------------- 
Physical Device information 
---------------------------------------------------------------------- 
     Device #1 
     Device is a Hard drive 
     State        : Online 
     Block Size       : 512 Bytes 
     Supported       : Yes 
     Programmed Max Speed    : SATA 6.0 Gb/s 
     Transfer Speed      : SATA 6.0 Gb/s 
     Reported Channel,Device(T:L)  : 0,0(0:0) 
     Reported Location     : Connector 0, Device 0 
     Vendor        : ATA 
     Model        : 

     Firmware       : 003Q 
     Serial number      : S2HTNX0H418779 
     World-wide name     : 5002538C402805A4 
     Reserved Size      : 265496 KB 
     Used Size       : 897129 MB 
     Unused Size      : 18327 MB 
     Total Size       : 915715 MB 
     Write Cache      : Enabled (write-back) 
     FRU        : None 
     S.M.A.R.T.       : No 
     S.M.A.R.T. warnings    : 0 
     Power State      : Full rpm 
     Supported Power States    : Full power,Powered off 
     SSD        : Yes 
     Temperature      : 39 C/ 102 F 
     NCQ status       : Enabled 
     ---------------------------------------------------------------- 
     Device Phy Information 
     ---------------------------------------------------------------- 
     Phy #0 
      PHY Identifier     : 0 
      SAS Address      : 30000D1701801803 
      Attached PHY Identifier   : 3 
      Attached SAS Address   : 50000D1701801800 
     ---------------------------------------------------------------- 
     Runtime Error Counters 
     ---------------------------------------------------------------- 
     Hardware Error Count    : 0 
     Medium Error Count     : 0 
     Parity Error Count     : 0 
     Link Failure Count     : 0 
     Aborted Command Count    : 0 
     SMART Warning Count    : 0 


Model, SSD 

---------------------------------------------------------------------- 
Physical Device information 
---------------------------------------------------------------------- 
     Device #2 
     Device is a Hard drive 
     State        : Online 
     Block Size       : 512 Bytes 
     Supported       : Yes 
     Programmed Max Speed    : SATA 6.0 Gb/s 
     Transfer Speed      : SATA 6.0 Gb/s 
     Reported Channel,Device(T:L)  : 0,0(0:0) 
     Reported Location     : Connector 0, Device 0 
     Vendor        : ATA 
     Model        : 

     Firmware       : 003Q 
     Serial number      : S2HTNX0H418779 
     World-wide name     : 5002538C402805A4 
     Reserved Size      : 265496 KB 
     Used Size       : 897129 MB 
     Unused Size      : 18327 MB 
     Total Size       : 915715 MB 
     Write Cache      : Enabled (write-back) 
     FRU        : None 
     S.M.A.R.T.       : No 
     S.M.A.R.T. warnings    : 0 
     Power State      : Full rpm 
     Supported Power States    : Full power,Powered off 
     SSD        : Yes 
     Temperature      : 39 C/ 102 F 
     NCQ status       : Enabled 
     ---------------------------------------------------------------- 
     Device Phy Information 
     ---------------------------------------------------------------- 
     Phy #0 
      PHY Identifier     : 0 
      SAS Address      : 30000D1701801803 
      Attached PHY Identifier   : 3 
      Attached SAS Address   : 50000D1701801800 
     ---------------------------------------------------------------- 
     Runtime Error Counters 
     ---------------------------------------------------------------- 
     Hardware Error Count    : 0 
     Medium Error Count     : 0 
     Parity Error Count     : 0 
     Link Failure Count     : 0 
     Aborted Command Count    : 0 
     SMART Warning Count    : 0 


Model, SSD 

In diesem Fall ist der Ausgang für Geräte # 0 bis Vorrichtung # 2 ist der gleiche, aber sie nicht wirklich für den Test wichtig. Also versuchen mit cat arcconf | awk '/Device #0/,/Device #1/', wo die obige Ausgabe in einer Datei namens Arcconf funktioniert. Aber versuchen, Variablen anstelle von 0 und 1 zu verwenden, funktioniert überhaupt nicht:

MIN_INDEX=0 
INDEX=1 
cat arcconf | awk '/Device #"$MIN_INDEX"/,/Device #"$INDEX"/' 
cat arcconf | sed -n -e "/Device #"$INDEX_MIN"$/,/Device #"$INDEX"$/{ /Device #"$INDEX_MIN"$/d; /Device #"$INDEX"$/d; p; }" 

Es zeigt nichts an. Könnten Sie bitte helfen.

Auch, wie ich die Ausgabe von Device zu Device Zeilen mehrmals verwenden werde, ist es möglich, es in einer neuen Variablen zu speichern, die ich in Zukunft verwenden soll?

Danke, Valentina

Antwort

0

Bash Variablen werden nicht in einfache Anführungszeichen erweitert, das ist, warum der erste Befehl funktioniert nicht. Einfache Anführungszeichen durch doppelte Anführungszeichen ersetzen:

cat arcconf | awk "/Device #$MIN_INDEX/,/Device #$INDEX/" 

Der zweite Befehl sollte funktionieren, aber es ist unnötig kompliziert. Sie brauchen nicht aus dem doppelten Anführungszeichen Zeichenfolge aus Gründen der Variablen fallen, wird dies funktionieren:

cat arcconf | sed -n -e "/Device #$INDEX_MIN$/,/Device #$INDEX$/{ /Device #$INDEX_MIN$/d; /Device #$INDEX$/d; p; }" 

In der Tat, es ist besser so, wie es jetzt die Variablen innerhalb eines zwei sind in Anführungszeichen, was eine gute Angewohnheit ist, da nicht-quotierte Variablen, die Leerzeichen enthalten, Probleme verursachen würden.

+0

Danke Janos. Scheint so, als ob es jetzt funktioniert. Wie wäre es, diese Ausgabe in eine andere Variable hinzuzufügen?Mit OUTPUT = 'cat arcconf | awk "/ Device # $ MIN_INDEX /,/Device # $ INDEX /" 'und druckt dann die OUTPUT-Variable, es zeigt alles in einer Zeile an. Gibt es eine Möglichkeit, es in einer Variablen genau so zu schreiben, wie es auf dem Bildschirm angezeigt wird (ich denke, vielleicht sollten Arrays wegen der neuen Zeilen verwendet werden)? – maimun4itu

+0

Das ist eine ganz andere Frage ... aber ok: Ich denke, Sie tun 'echo $ OUTPUT', wenn die Ausgabe in einer Zeile ist. Um in mehreren Zeilen anzuzeigen, doppel-zitieren Sie die Variable im 'echo', wie folgt: 'echo" $ OUTPUT "' – janos

0

Sie können über -v var=val Variablen awk senden: durch Bewegen p; um

awk \ 
    -v start="Device #$MIN_INDEX" \ 
    -v end="Device #$MAX_INDEX" \ 
    '$0 ~ end { p=0 } 
    $0 ~ start { p=1 } 
    p' arcconf 

einfach können Sie, ob die Start- und Ziellinie sind:

$0 ~ end { p=0 }; p; $0 ~ start { p=1 } # Will not include start nor end 
$0 ~ end { p=0 }; $0 ~ start { p=1 }; p # Will include start and end 
$0 ~ start { p=1 }; p; $0 ~ end { p=0 } # Will include start but not end 
$0 ~ end { p=0 }; p; $0 ~ start { p=1 } # Will include end but not start 
0

Sie können versuchen, unter dem Befehl sed -

Und die Ausgabe in eine Variable zu setzen -

#sed -n "/Device\ #$MIN_INDEX/,/Device\ #$INDEX/w output.txt" kk.txt 
#var=`cat output.txt` 
#echo $var 

Erklärung

-n doppelte, wenn Mustervergleich zu entfernen.

w ist die Ausgabe zu schreiben output.txt

p zu drucken Datei ist. Wir müssen das Escape-Zeichen \ verwenden, um das Leerzeichen zu suchen.