grep 文件读取 key:value

grep a file to read a key:value

我有一个文件 file.txt,其中有多个 key:value 对。从文件中读取特定的 value 时,打印了多行。请帮助我纠正下面的逻辑。

INPUT_FILE

cat file.txt

NAMES:1234-A0;5678-B0;3456-C0
1234-A0:1234_12345678_987

DESIRED_OUTPUT

1234_12345678_987

MY_CODE

cat file.txt | grep -w 1234-A0 | cut -f2 -d ':'

输出

1234-A0;5678-B0;3456-C0 1234_12345678_987

请告诉我上面的命令有什么问题 (?) 以及获取 desired output 的正确命令应该是什么。谢谢!

awk 是执行此操作的正确工具,因为您的数据由通用字符分隔并按列和行构建。你可以使用这个 awk 命令:

awk -F: ' == "1234-A0"{print }' file

1234_12345678_987

首先,

Please let me know what's wrong in the above command

当你写 cat file.txt | grep -w 1234-A0 应该是 grep -w 1234-A0 file.txt (我的意思是从 cat 传送到一个可以直接读取文件的命令是没有用的, 再加上你正在吃掉一些宝贵的资源,同时让你的脚本成为次优的)
话虽这么说,您要求的是带有单词“1234-A0”的行……而这正是您的输出! 现在尝试以下操作并记下不同之处:

  • grep ':1234-A0' file.txt(你应该有第一行)
  • grep '1234-A0:' file.txt(你应该有第二个)
  • grep '^1234-A0' file.txt(第二行也是)

添加更多行,在文件的其他地方随机添加“1234-A0”,然后重新运行上面的示例 查看差异。

最后,

what should be the correct command

一旦你给出了正确的模式,你现在就可以像你一样进行切割: grep '^1234-A0:' file.txt | cut -f2 -d: 例如。

AWK语言是另一种方式,更简洁,但不是现在这样 仍在学习 BRE(也在 sedvi 中找到,而 awk 使用 ERE)