【问题标题】:Extract arguments提取参数
【发布时间】:2018-06-25 01:26:30
【问题描述】:

我正在致力于在 Cloud Foundry 中自动化 CUPS(创建用户提供的服务)。我有一个cups.sh 文件,其中包含要为特定应用程序执行的相应cf cups 命令。下面是示例:

cf cups service-A -p '{"uri": "https://sample uri"}'
cf cups service-B -p '{"uri": "https://sample uri","id": "abcd","token": "xyz"}'

我正在尝试编写一个脚本将执行以下用例:

逐行解析cups.sh并提取服务名称(例如service-A)和-p后面的参数(例如:'{"uri": "https://sample uri","id": "abcd","token": "xyz"}')。

我目前正在使用以下脚本:

File=cups.sh
sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$File" | while read line
do
    temp=$(echo $line | cut -d' ' -f4)
    echo $temp
done

这不准确,因为它返回给我"https://sample uri"}'。是否有更准确的方法来提取参数-p 并将其用于进一步操作?

【问题讨论】:

  • 它没有提供准确的结果....我想在 -p 参数之后存储所有内容,包括括号和变量。
  • 假设您的字段都是“单个空格分隔”的,请执行echo $line | cut -d ' ' -f5-,它会打印字段 5 以及之后的所有内容。

标签: unix sed text-parsing


【解决方案1】:

提取我们需要的东西:

$> sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/\1 \2/;p}' cups.sh

service-A '{"uri": "https://sample uri"}'
service-B '{"uri": "https://sample uri","id": "abcd","token": "xyz"}'

现在,形成将所有结果推送到 2 个数组(_srv_cmd)的命令:

$> sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/_srv+=('"'"'\1'"'"') _cmd+=(\2)/;p}' cups.sh

_srv+=('service-A') _cmd+=('{"uri": "https://sample uri"}')
_srv+=('service-B') _cmd+=('{"uri": "https://sample uri","id": "abcd","token": "xyz"}')

最后,将所有内容放入一个 bash 文件中

#!/bin/bash

_fil=cups.sh
_srv=()
_cmd=()

eval `sed -n -r '/^\s*cf\s+cups\s+.+.*-p\s+'"'"'.+'"'"'/{s/\s*cf\s+cups\s+(.+)\s.*-p\s+('"'"'.+'"'"').*$/_srv+=('"'"'\1'"'"') _cmd+=(\2)/;p}' "$_fil"`

# test

_len=${#_srv[@]}
for (( i=-1;++i<_len; )); do
  echo ${_srv[$i]} ${_cmd[$i]}
done

  1. ^\s*cf\s+cups\s+:搜索以cf cups ...开头的行
  2. \s+(.+)\s:将第三列(由\s(空格)分隔)提取为\1
  3. -p\s+('"'"'.+'"'"'):在-p 之后提取'' 之间的内容为\2(包括''

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    $ # only lines with successful substitutions will be printed
    $ sed -n 's/.*service-A -p //p' ip.txt
    '{"uri": "https://sample uri"}'
    $ sed -n 's/.*service-B -p //p' ip.txt
    '{"uri": "https://sample uri","id": "abcd","token": "xyz"}'
    
    $ # to save results in variable
    $ a=$(sed -n 's/.*service-A -p //p' ip.txt)
    $ echo "$a"
    '{"uri": "https://sample uri"}'
    

    awk

    $ awk -F"'" -v sq="'" '/service-A/{print sq $2 sq}' ip.txt
    '{"uri": "https://sample uri"}'
    


    将搜索词作为变量传递

    $ st='service-A'
    $ sed -n 's/.*'"$st"' -p //p' ip.txt
    '{"uri": "https://sample uri"}'
    
    $ awk -F"'" -v s="$st" -v sq="'" '$0 ~ s{print sq $2 sq}' ip.txt
    '{"uri": "https://sample uri"}'
    

    【讨论】:

    • 你能说明如何在问题的while循环中使用它吗?因为我不想硬编码服务名称,即服务 A、服务 B 等...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2011-10-09
    • 2015-03-07
    相关资源
    最近更新 更多