unix-awk重复模式

unix-awk重复模式,unix,awk,Unix,Awk,我有以下变量。我想用模式“/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/”进行搜索 我试着像下面一样它第一次单独出现 [ggangadharan@phxbastion2 ~]$ echo $str | awk '{match($0, "/x/home[/,a-z,0-9,_]+*", a)}END{print a[0]}' /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2

我有以下变量。我想用模式“/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/”进行搜索

我试着像下面一样它第一次单独出现

[ggangadharan@phxbastion2 ~]$ echo $str | awk '{match($0, "/x/home[/,a-z,0-9,_]+*", a)}END{print a[0]}'
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//
但我希望输出如下

/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//
有人能帮我在这个场景中如何使用awk吗


提前感谢

我不确定如何在awk中破解此问题,但您可以在此处安全使用egrep:

$ echo $str | egrep -o /x/home[/,a-z,0-9,_]+*
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//
在AWK中使用“重大拆分”:


这里有两种使用JSON感知命令行工具的方法

在这两种情况下,我们都假设兴趣字符串嵌入到 $str中包含的JSON对象

(1) 在下面,我们只是简单地打印JSON对象和grep for 万一它出现在一个令人惊讶的地方,那就引起人们的兴趣。根据需要,可以轻松地对结果进行进一步微调(例如,使用sed):

$ sed 's/^[^{]*//' <<< "$str" | jq '.[]' | fgrep /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//"

$sed's/^[^{]*/'Awk处理每一行,您必须进行一些重要的拆分以解析该行并进行多次搜索。您可以使用egrep解决这个特定问题,但更一般地说,您可以使用其他脚本工具解析JSON。为此,您还可以
echo$str | egrep-o localDir[^,]*|Awk'{print$2}“
谢谢ferdy。如果我们使用grep,它通常会起作用,它会正确地给出整行内容??您能解释一下这个功能吗?因为我是unix脚本编写新手。通常您会使用grep-E(或egrep,两者相同)如果您在带有终止行的文件中搜索模式,并返回这些模式。为了-E的缘故,可以使用正则表达式模式,并将返回当前行中出现的所有模式,就像我们在这里所做的那样。我添加了-o(这意味着--仅匹配)只需获得正则表达式的匹配结果。如果不使用它,将显示包含json的日志条目的整行内容;正如我所说的,通常使用grep查找与某个模式匹配的行。HTHThanks ferdy为您提供解释。很好,不过我建议使用grep,这会让您的代码更可读经验较少的awk用户。;)
$ awk -v RS="\"" '/\/x\/home\/pp_dt_fpti_batch\/stampy_copy_orchestration\//' <<< "$str"
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10// /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10// /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10// /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10// /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10// /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//
$ awk -v RS='"' '/regexp/' <<< "$str"
$ sed 's/^[^{]*//' <<< "$str" | jq '.[]' | fgrep /x/home/pp_dt_fpti_batch/stampy_copy_orchestration/
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10//"
"localDir": "/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//"
sed 's/^[^{]*//' <<< "$str" |
  jq -r '..
      | select(.localDir?)
      | .localDir
      | select(test("/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/"))'

/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_4//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_1//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_2//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_3//2016/02/02/10//
/x/home/pp_dt_fpti_batch/stampy_copy_orchestration/tmp_5//2016/02/02/10//