如何使用 GREP 搜索必须在同一行上另一个模式第 n 次出现之后出现的模式?

如何使用 GREP 搜索必须在同一行上另一个模式第 n 次出现之后出现的模式?

我有一个文件,其中的记录以竖线(“|”)分隔。我需要仅在第 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

相关内容