파일에서 정확한 여러 문자열을 얻으려면 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 Number.Part 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

더 안전하려면 패턴 뒤에 0개 이상의 공백이 있고 다음과 같은 경우에만 일치하는지 확인할 수 있습니다 :.

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

관련 정보