我有一个文件,其中的记录以竖线(“|”)分隔。我需要仅在第 6 列上搜索特定字符串,然后通过 grep 实用程序返回整行。总共有 10 列,因此有 9 个竖线。在下面的示例行中,我需要搜索“G50483”,仅应返回第 2 条记录。:-
3DEAC-9AF7-4EEE-9ACD-A6E376C5727C | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D ||Y| 610535 | DEFERRAL-TASK CLAIMED | RON BOW - ORD Arv 10-SEP-2015 20:48, BOW-Line 2 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 1G50483 every 50FH to ensure no additional damage is present|| GMT |11-SEP-11
26BDF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED |RON BOW - ORD Arv 25-SEP-2015 21:46, BOW-Line 6 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N G50483 every 50FH to ensure no additional damage is present || GMT | 27-SEP-10
G50483 26B2F1DF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED | RON BOW - ORD Arv 25-SEP-2015 21:46, BOW-Line 6 Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 3G50483 every 50FH to ensure no additional damage is present|| GMT | 27-SEP-05
答案1
如果必须的话grep
:
grep -Em2 "([^|]+|){6}[^|]+G50483.*' file | tail -n1
-E
激活扩展正则表达式-m2
在第二场比赛停止'...'
正则表达式[^|]+|
搜索一个或多个 (+
) 字符,这些字符不是|
后跟管道符的管道符。(...){6}
连续执行了 6 次,因此我们现在处于第 7 个字段。您的问题提到了第 6 个字段,但我根据示例输入假设是第 7 个字段。{5}
如果需要,请将其更改为。[^|]+
现在我们再次搜索非管道字符,直到最终的搜索模式:G50483
实际模式
tail -n1
是必要的,因为grep
单独无法仅打印第 n 次出现,而tail
会剪切仅出现第 2 次的其他出现。
答案2
在 Unix 中,您需要选择适合工作的工具,因为它为您提供了工具包。grep适用于整行。请使用 awk:
awk -F "|" '$6 ~ /G50483/ { print $2; }'
-F
在这种情况下,字段分隔符是“|”$6
是要搜索模式的列~
匹配模式(可以使用 == 进行精确匹配)/pattern/
搜索模式$2
- 第二字段($0
全部为行)
更多信息请点击这里:有效的 AWK 编程 - 4e。