我有一个字符串id=12345&data=23456
我想打印12345 23456
目前我只知道如何用awk
echo id=12345&data=23456 | awk -F"id=" '{print substr($2,1,5)}'
和数据类似。
如何组合这些awk命令以获得所需的结果?
答案 0 :(得分:1)
正则表达式组可以是一个解决方案,但awk无法处理正则表达式组,但是,gawk可以。
示例强>
echo "id=12345&data=23456" | gawk 'match($0, /^id=([^&]*)&data=(.*)$/, groups) {print groups[1] " " groups[2]}'
<强>输出强>
12345 23456
答案 1 :(得分:1)
不需要外部流程。您可以使用内置read
来提取两个数字:
$ IFS="=&" read _ num1 _ num2 <<< "id=12345&data=23456"
$ printf "%s\n" "$num1" "$num2"
12345
23456
答案 2 :(得分:0)
使用awk
:
echo "id=12345&data=23456" | awk -F[\&=] '{ print $2,$4}'
grep
和tr
:
echo "id=12345&data=23456" | grep -o '[0-9]\+' | tr '\n' ' '
注意:上面的命令会在最后添加一个空格。
答案 3 :(得分:0)
看起来像我的查询字符串...我建议解析它。例如,使用PHP:
echo "id=12345&data=23456" | php -r 'parse_str(fgets(STDIN), $query); print_r($query);'
这给出了输出:
Array
(
[id] => 12345
[data] => 23456
)
因此,要获得您想要的输出,您可以选择:
$ echo "id=12345&data=23456" | php -r 'parse_str(fgets(STDIN), $query); echo $query["id"] . " " . $query["data"];'
12345 23456
对于快速而又脏的替代方案,您可以使用sed:
$ echo "id=12345&data=23456" | sed -r 's/id=([^&]+)&data=([^&]+)/\1 \2/'
12345 23456
这会捕获id=
后的&
部分以及&data=
后的部分直到下一个&
(如果有的话)。这种方法的缺点是,如果查询字符串的两个部分的顺序相反,它会中断,但它可能对你的用例来说已经足够了。
答案 4 :(得分:0)
替代代码
echo "id=12345&data=23456" | tr -s '&' '\n' | cut -d '=' -f 2 | tr -s '\n' ''
答案 5 :(得分:0)
根据您要对输出做的事情,其中一个可能就是您所需要的:
$ echo 'id=12345&data=23456' | tr -c -s '[0-9]' ' '
12345 23456 $
$ echo 'id=12345&data=23456' | tr -s '[a-z=&]' ' '
12345 23456
$