Linux grep文件以读取key:value

Linux grep文件以读取key:value,linux,shell,sh,Linux,Shell,Sh,我有一个文件file.txt,它有各种key:value对。从文件中读取特定的值时,会打印多行。请帮我纠正下面的逻辑 输入_文件 cat file.txt NAMES:1234-A0;5678-B0;3456-C0 1234-A0:1234_12345678_987 所需的_输出 1234\u 12345678\u 987 我的密码 cat file.txt NAMES:1234-A0;5678-B0;3456-C0 1234-A0:1234_12345678_987 cat file.

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

输入_文件

cat file.txt

NAMES:1234-A0;5678-B0;3456-C0
1234-A0:1234_12345678_987
所需的_输出

1234\u 12345678\u 987

我的密码

cat file.txt

NAMES:1234-A0;5678-B0;3456-C0
1234-A0:1234_12345678_987
cat file.txt | grep-w 1234-A0 | cut-f2-d':'

输出

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


请让我知道上面的命令(?)有什么错误,以及获得所需输出的正确命令应该是什么。谢谢

awk
是实现这一点的合适工具,因为您的数据由公共字符分隔,并以列和行的形式进行结构化。您可以使用此awk命令:

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

首先,

请让我知道上面的命令有什么问题

编写
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”,然后重新运行上面的示例 看看有什么不同

最后,

正确的命令应该是什么

一旦给出正确的图案,现在就可以像以前那样进行管道切割:
grep'^1234-A0:'file.txt | cut-f2-d:
例如

AWK语言是另一种方式,更简洁,但现在不是你现在的样子
仍在学习BRE(也可以在
sed
vi
中找到,而
awk
使用ERE)

感谢@gildux的详细解释。这真的帮助了我。