linux - 仅返回匹配模式之后的行部分

标签 linux shell unix

我需要帮助来处理命令,其中它是一个 * (星号)分隔文件,具有多行,如下所述。我想搜索以 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/

相关文章:

linux - shell脚本中的问题

linux - 通过从特定目录递归搜索,从所有文本文件中提取最后一行

c - 如何在 Linux 中不安全地删除 block 设备驱动程序

bash - 空白的 shell 脚本第一行 : explain behavior of UID variable

python - 如何让 Python Interactive Shell 打印西里尔字符?

java - 是否可以使用 Unix 套接字在 C 应用程序和 Java 应用程序之间创建通信?

linux操作系统返回值

linux - Shell脚本,将每2个文件移动到每个目录

linux - 如何从 Top 捕获 CPU 空闲时间

unix - Vim 更新当前查看的文件