在awk和/或sed中使用变量

时间:2016-11-02 06:26:21

标签: bash awk

在下面输出的bash脚本中,我需要打印" Device#0"之间的行。和#34;设备#1",但由于所有这些都是更大的脚本的一部分,我应该使用变量作为开始/停止线。

----------------------------------------------------------------------
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

在这种情况下,设备#0到设备#2的输出是相同的,但它对测试来说并不重要。 因此尝试使用cat arcconf | awk '/Device #0/,/Device #1/'将上面的输出存储在名为arcconf的文件中。但是尝试使用变量而不是0和1根本不起作用:

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; }"

它不会显示任何内容。 能帮忙吗?

另外,由于我要多次使用Device to Device行的输出,是否可以将它存储在一些我将来应该使用的新变量中?

谢谢, 瓦伦蒂娜

3 个答案:

答案 0 :(得分:0)

Bash变量不会在单引号内展开,这就是第一个命令不起作用的原因。用双引号替换单引号:

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; }"

事实上这种方式更好,因为现在变量都在双引号字符串中,这是一个好习惯,因为包含空格的不带引号的变量会导致问题。

答案 1 :(得分:0)

您可以通过-v var=val将变量发送到awk:

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

只需移动p;即可,无论是否包含起点和终点:

$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

答案 2 :(得分:0)

  

您可以尝试以下sed命令 -

#MIN_INDEX=0
#INDEX=1
#sed -n "/Device\ #$MIN_INDEX/,/Device\ #$INDEX/p" kk.txt

并将输出设置为变量 -

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

解释

-n在模式匹配时删除重复项。

w是将输出写入文件output.txt

p是要打印的。我们需要使用转义字符\来搜索空格。