我有一个包含硬件信息的文件。例如
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
也触及了另一条线。
我什至尝试-w
使用 grep 选项,但我没有在控制台上得到任何输出。看起来精确匹配会失败,因为我们为硬件文件中的每个字段都有一些值
有人可以帮帮我吗 。我怎样才能避免被排除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