我需要帮助来处理命令,其中它是一个 *
(星号)分隔文件,具有多行,如下所述。我想搜索以 NM1*IL
开头的行并提取最后一列。下面是显示的示例。
$ cat temp.txt
NM1*IL*1*RESTAR*FRENNY*M***MI*99358358~
N3*2164 Boeing Avenue~
N4*NEW DELHI*CA*94114~
DMG*D0*19550610*F~
NM1*PR*2*KFHP*****PI*94135~
NM1*IL*1*STAR*FRENY*M***MI*99358958~
NM1*IL*1*RESTA*ANNIE*M***MI*993583589~
我想要如下的输出
99358358
99358958
993583589
最佳答案
grep 'NM1[*]IL' temp.txt | awk -F'*' '{print $NF}' | sed 's/~$//'
您可以运行此管道的部分内容(最多但不包括 |
)来查看特定命令对您的输入执行的操作。
grep 'NM1[*]IL'
— 过滤输入行,以便仅留下与此模式匹配的行。 grep
采用正则表达式作为其参数,而 *
是一个特殊的正则表达式字符(表示其后面的 0 个或多个符号),因此需要转义。我在这里使用了字符类 ([]
),因为我认为它很简洁。可以使用 NM1\*IL
达到相同的效果。
awk -F'*'
— -F
指定字段分隔符,我将其设置为 *
。 awk 将每个输入行拆分为字段,因此两个 *
之间的任何内容都是 awk 的字段。
'{print $NF}'
是现在将在其输入上执行的 awk 程序。它表示“对于所有输入行,打印带有编号 NF
的字段”,其中 NF
是一个特殊的 awk 变量,它代表“字段数量”。所以它所做的就是打印最后一个字段。
sed 's/~$//'
— 只需删除尾随的 ~
。 $
表示行尾。因此,此 sed 将 EOL 前面的任何 tildas 替换为空字符串。可以写成 tr -d '~'
,但这个 sed 更精确(仅在 EOL 之前删除 tildas)。
grep(1)
, awk(1p)
,和sed(1)
都是标准 UNIX 命令行实用程序。研究手册页以获取有关如何使用它们的更多信息。
关于linux - 仅返回匹配模式之后的行部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55846277/