shell - 如何在文件中逐行循环时获取一行中的值(shell 脚本)

标签 shell awk sed grep

我有一个如下所示的文件 (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/

相关文章:

linux - 搜索给定目录以外的文件

bash - 使用 GNU 拆分的错误数字后缀

git - 从 Jenkins 管道捕获 shell 脚本输出

Linux 按特定列的总和过滤文本行

linux - sed 正则表达式不贪心?

c++ - 使用模板格式化 C++ 字符串

java - 在 Eclipse 中运行 Java 应用程序时如何避免 glob 扩展

linux - 如何删除 .CSV 文件中第二次出现的模式后的其余记录

linux - 如何在 shell 中创建一个包含多列的循环?

linux - 我怎样才能用 sed 排除特定行?