我有一个如下所示的文件 (file.txt)
{"key":"AJGUIGIDH568","rule":squid:111-some_random_text_here
{"key":"TJHJHJHDH568","rule":squid:111-some_random_text_here
{"key":"YUUUIGIDH566","rule":squid:111-some_random_text_here
{"key":"HJHHIGIDH568","rule":squid:111-some_random_text_here
{"key":"ATYUGUIDH556","rule":squid:111-some_random_text_here
{"key":"QfgUIGIDH568","rule":squid:111-some_random_text_here
我想逐行循环并提取键值。
所以结果应该是这样的,
AJGUIGIDH568
AJGUIGIDH568
YUUUIGIDH566
HJHHIGIDH568
ATYUGUIDH556
QfgUIGIDH568
所以我编写了这样的代码来逐行循环并提取 {"key":"
和 ","rule":
之间的值,因为键值介于这两种模式之间。
while read p; do
echo $p | sed -n "/{"key":"/,/","rule":,/p"
done < file.txt
但这不起作用。有人可以帮我解决这个问题吗?提前致谢。
最佳答案
您的示例输入几乎是有效的 json。您可以调整它以使其有效,然后使用 jq
提取值,如下所示:
sed -e 's/squid/"squid/' -e 's/$/"}/' file.txt | jq -r .key
或者,如果您的实际输入确实是有效的 json,则只需使用 jq
:
jq -r .key file.txt
如果“random-txt”可能包含双引号,使得很难调整输入以使其成为有效的 json,也许您想要类似的内容:
awk '{print $4}' FS='"' file.txt
或
sed -n '/{"key":"\([^"]*\).*/s//\1/p' file.txt
或
while IFS=\" read open_brace key colon val _; do echo "$val"; done < file.txt
关于shell - 如何在文件中逐行循环时获取一行中的值(shell 脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73421309/