Linux 如何基于模式匹配从一个文件到另一个文件拾取特定行

Linux 如何基于模式匹配从一个文件到另一个文件拾取特定行,linux,shell,awk,sed,Linux,Shell,Awk,Sed,我想匹配一个模式,并在该模式匹配后完全选择下一行。我在文件1中有以下输入的文件: { "lotsoftext": [ ........ ], { "Key": "Envvi", "Value": "model" }, { "Key": "Department", "Value": "Sys" } { "Key": "Subdept", "Value": "io" }

我想匹配一个模式,并在该模式匹配后完全选择下一行。我在文件1中有以下输入的文件:

{
    "lotsoftext": [
........
],
  {
        "Key": "Envvi",
        "Value": "model"
  },
  {
        "Key": "Department",
        "Value": "Sys"
  }
  {  
        "Key": "Subdept",
        "Value": "io"
  },
}
....
我希望输出像在单独的文件2 模型系统

“Key”:“Envvi”,“Key”:“Department”
->在所有文件中保持不变,但值不断变化。一次可能是Sys,另一次可能是Fin,等等。我只需要下面的行模式匹配
“Key”:“Envvi”
,和
“Key”:“Department”
,。在最后的输出中,我在Department中的Ennvi连字符值前面加上'something'单词,后面加上'.'下划线。我设法用awk删除了一些行,但无法匹配我想要的。这对我来说太复杂了。请提供任何帮助回答1:

egrep -A 1 "Envvi|Department" example_1.txt | awk -F: -v ORS="-" '/Value/ {print tolower($2)}' | sed -e 's/[" ]//g' -e 's/-$/\n/' -e 's/^/aws_/'
输入:cat示例_1.txt

{
    "Key": "Envvi",
    "Value": "model"
 },
 {
    "Key": "Department",
    "Value": "Sys"
 }
 {
    "Key": "Subdept",
    "Value": "io"
 }
输出:

something_model-sys
补充进一步解释:

1) egrep-A 1“Envvi | Department”example_1.txt-->搜索所需的键值,并打印该行和匹配(-A 1)后的一行。仅第一步的输出如下:

"Key": "Envvi",
"Value": "model"
--
"Key": "Department",
"Value": "Sys"
2) awk-F:-v ORS=“-”'/Value/{print tolower($2)}'-->这将从以前的输出中查找值对,并使用“:”作为字段分隔符打印第二个字段。tolower()用于小写输出。以下是此步骤的输出。请注意,由于ORS设置为“-”,因此末尾没有换行符

3) sed-e的//[“]//g'-->此部分接受上一步的输入,并删除任何双引号和空格。以下是此步骤后的输出。请注意,最后仍然没有换行符

model-sys-
model-sys
4) 's/-$/\n/'-->sed的第二部分采用上一步的输入,并用换行符替换行末尾最后出现的hypen(-)。以下是此步骤之后的输出。请注意,现在在末尾有一个换行符

model-sys-
model-sys
5) 's/^/aws_u/'-->sed的最后一部分从上一步获取输入,并将“aws_u”字符串添加到行的开头

aws_model-sys
在GNU AWK中工作的答案1的进一步改进/简化版本(使用gsub):


如果数据在“d”文件中,由gnu sed

sed -En '/\s*"Key":\s*"Envvi"|\s*"Key":\s*"Department"/{n;p}' d

您的输入看起来像JSON;使用JSON解析器。
jq
几乎是事实上的标准。这给了我类似于aws_模型aws_Sys aws_io的东西,但我想要这个aws_模型-Sys-io您使用的是什么awk、sed和OS?我得到了我所展示的确切输出。也许环境正在改变。我已经改进了我的答案,ad戴德·托洛尔“在awk中打印,因为您需要小写输出,并为每个步骤提供解释。根据您在本评论中提到的输出,似乎ORS无效。正如我所提到的,一步一步地检查输出,它将帮助您确定断开连接的位置。如果你需要进一步的帮助,请告诉我。我正在使用Redhat7.x以及ubuntu 16中所要求的。GNU Awk 4.0.2I管理的wht要求如下。但它看起来太笨拙了,因为我对脚本编写还不熟悉,而你的看起来很简单。这里,如果您看到我省略了“io”值,因为它不是必需的。我根据关键的环境和部门进行了筛选。选择了环境和生产的下一行。sed-n'/Environment/{n;p}'file1>file2sed-n'/Department/{n;p}'file1>>file2sed'$!s/$/124;/'file2>file3 cat file3 | tr-d“\t\n\r”| sed's/Value//g'| sed's///g'>file5 sed-e's///something-/'file5 | sed-e's//'file21>file22 O/p是something-model\u系统这个答案可以替换为下面答案中的“egrep A 1”Envvi | Department“example”\u 1.txt”,然后我也可以得到所需的输出。