提取参数

时间:2018-01-16 10:53:00

标签: unix sed text-parsing

我正在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并将其用于进一步操作?

2 个答案:

答案 0 :(得分: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"}'

现在,使用form命令将所有结果推送到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. 开头的行
  3. \s+(.+)\s:将第三列(由\s(空格)分隔)提取为\1
  4. -p\s+('"'"'.+'"'"')'' -p之后\2 '' Route::get('anyroute', array('as' => 'newname', function() { $url = route('new_name'); return "This is the $url"; })); 包括ngAfterViewInit

答案 1 :(得分:0)

这是你在找什么?

$ # 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"}'