ファイルから複数の正確な文字列を取得するには、grep

ファイルから複数の正確な文字列を取得するには、grep

ハードウェア情報を含むファイルがあります。例えば

Part Number                          : 0-0000-00
Board Revision                       : 0
PCB Serial Number                    : ZKZHY5431ZG
PCB Fab Part Number                  : 0-0000-00
Deviation Number                     : 0
MAC Address                          : FC:58:9A:07:4F:D4
MAC Address Block Size               : 4
PCA Assembly Number                  : 000-00000-00
PCA Revision Number                  : 0
Product/Model Number                 : IG21-EU-E-K9
Top Assembly Part Number             : 074-123960-01
Top Revision Number                  : 02
Top Assembly Serial Number           : PSZ24351JZG
RMA Test History                     : 00
RMA History                          : 00
PEP Product Identifier (PID)         : IG21-EU-E-K9
PEP Version Identifier (VID)         : V00
System Flags                         : 00
Controller Type                      : 0000
Host Controller Type                 : 0000   
Mfr Service Date                     : 2020.12.28-47:59:59

excludeハードウェアファイルでcatをするときに少ない行を書きたいです。これを達成するために、次のコマンドを試しました。

cat hardware.txt | grep -Ev 'Part Number|Board Revision|PCB Fab Part Number|PCA Assembly Number|PCA Revision Number'

うまくいきますが、小さな問題があります。このコマンドを実行するとTop Assembly Part NumberPart Number

grepオプションを試してみましたが、-wコンソールには何も出力されません。ハードウェアファイルの各フィールドにいくつかの値があるため、正確な一致が失敗するようです。

誰か私を助けてください。除外されることをどのように避けることができますか?Top Assembly Part Number

答え1

行の先頭にパターンを固定するだけです^。どちらも必要ありませんcat。必要なものは次のとおりですgrep

$ grep -Ev '^(Part Number|Board Revision|PCB Fab Part Number|PCA Assembly Number|PCA Revision Number)' file
PCB Serial Number                    : ZKZHY5431ZG
Deviation Number                     : 0
MAC Address                          : FC:58:9A:07:4F:D4
MAC Address Block Size               : 4
Product/Model Number                 : IG21-EU-E-K9
Top Assembly Part Number             : 074-123960-01
Top Revision Number                  : 02
Top Assembly Serial Number           : PSZ24351JZG
RMA Test History                     : 00
RMA History                          : 00
PEP Product Identifier (PID)         : IG21-EU-E-K9
PEP Version Identifier (VID)         : V00
System Flags                         : 00
Controller Type                      : 0000
Host Controller Type                 : 0000   
Mfr Service Date                     : 2020.12.28-47:59:59

より安全にするには、パターンの後にゼロ以上のスペースがあり、次の場合にのみ一致することを確認できます:

grep -Ev '^(Part Number|Board Revision|PCB Fab Part Number|PCA Assembly Number|PCA Revision Number) *:' file

答え2

この種の作業には問題ありませんがgrep、bashでこれを行う他の方法を指摘したかったのです。次のようになります。

#!/usr/bin/env bash

lines_to_ignore=("Part Number" "Board Revision" "PCB Fab Part Number" "PCA Assembly" "PCA Revision Number")
lines=()
while read -r line 
   do
    for e in "${lines_to_ignore[@]}"
      do
        [[ $line == *$e* ]] || [[ -z $line ]] && continue 2
      done
    lines+=("$line")
done < hardware.txt
printf '%s\n' "${lines[@]}"

またはawk

awk 'NF && !/^(Part Number|Board Revision|PCB Fab Part Number|PCA Assembly|PCA Revision Number)/' hardware.txt

関連情報