Sed / Awk解析某些字符之间的行

时间:2014-02-26 19:36:48

标签: bash sed awk

我很难尝试解析以下内容:

当前为变量分配的信息是:

position: 170.198.19.170/net1
position: 170.198.19.165/rxy
position: take1234/net 
position: imwell/net3
position: xyz/444
position: 170.198.82.142/net
position: whoareu/net

我想在“位置:”和斜线“/”之间打印所有字符减去空格并将它们打印在新行上

所以最终结果应该是:

170.198.19.170
170.198.19.16
take1234
imwell
xyz  
170.198.82.142

whoareu

有人可以帮忙吗。尝试一些TR和Sed替换,但只是没有得到它。

提前感谢你

8 个答案:

答案 0 :(得分:3)

使用awk:

awk -F '[:/ ]+' '$2=="position"{print $3}' file
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu

修改

awk -F ':' '$1 ~ /position/{gsub(/ +|\/.*$/, ""); print $2}' file

答案 1 :(得分:2)

假设您的数据位于名为input 的变量中:

使用cut

$ cut -d' ' -f2 <<< "$input" | cut -d/ -f1
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$ 

使用mapfile(需要&gt; = 4.0)并在结果数组元素上进行参数扩展的有趣纯粹方式。最终结果是数组元素a中所需的数据:

$ mapfile -t a <<< "$input"
$ a=("${a[@]%%/*}")
$ a=("${a[@]##*: }")
$ echo ${a[@]}
170.198.19.170 170.198.19.165 take1234 imwell xyz 170.198.82.142 whoareu
$ 

另一种纯粹的bash方式,使用IFS变量分隔/

$ while IFS=" /" read _ x _; do echo "$x"; done <<< "$input"
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$ 

可能是最短的awk

$ awk -F '[ /]' '{print $2}' <<< "$input"
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$ 

答案 2 :(得分:2)

尝试类似:

awk '{sub(/\/.*/,"",$2); print $2}' file

$ awk '{sub(/\/.*/,"",$2); print $2}' << EOF
position: 170.198.19.170/net1
position: 170.198.19.165/rxy
position: take1234/net 
position: imwell/net3
position: xyz/444
position: 170.198.82.142/net
position: whoareu/net
EOF
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu

答案 3 :(得分:1)

sed 's/position:[ ]*/\n/g' t|sed 's_/[a-zA-Z0-9]*__g'|sed '/^\s*$/d'

会做的伎俩。

这是如何运作的?

  1. position:转换为换行符。
  2. 删除} 一行以外的所有内容。
  3. 删除空行。
  4. 你得到了你想要的东西。

    要理解为什么要这样做,请注意OP最初有以下输入:

      

    位置:170.198.19.170/net1位置:170.198.19.165 / rxy位置:   take1234 / net position:imwell / net3 position:xyz / 444 position:   170.198.82.142/net position:whoareu / net position:

    比现在相对微不足道的输入更难

    /

    对于更新的输入aman@apollo:~/entire-src/py/imgdata$ cat t position: 170.198.19.170/net1 position: 170.198.19.165/rxy position: take1234/net position: imwell/net3 position: xyz/444 position: 170.198.82.142/net position: whoareu/net position: aman@apollo:~/entire-src/py/imgdata$ sed 's/position:[ ]*/\n/g' t|sed 's_/[a-zA-Z0-9]*__g'|sed '/^\s*$/d' 170.198.19.170 170.198.19.165 take1234 imwell xyz 170.198.82.142 whoareu aman@apollo:~/entire-src/py/imgdata$ 将有效。这里cut -f2 -d' ' t|sed 's_/[a-zA-Z0-9[:punct:]]*__g'是存储模式的文件的名称。

答案 4 :(得分:1)

使用sed:

$ sed -ne '/^position: /{;s/^position: //;s:/.*::;p;}' <<< "$input"
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$ 

或者awk:

$ awk '/^position: /{sub(/^position: /, ""); sub(/\/.*/,""); print;}' <<< "$input"
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$

或者只是使用bash:

$ while read one two ; do [ "$one" = "position:" ] && echo "${two%%/*}" ; done <<< "$input"
170.198.19.170
170.198.19.165
take1234
imwell
xyz
170.198.82.142
whoareu
$

有很多方法可以给这只猫上皮。

答案 5 :(得分:1)

试试这个:

echo "$variablename" | sed "s/position:/\npostion:/g" | cut -d"/" -f 1| cut -d " " -f 2 | sed '/^$/d'

这是更新的答案,其中'position:'在ethe行只出现一次,我没有使用cut

echo "$variablename" | sed "s/position: //" | sed "s/\//\n/" | sed -n '2~2!p'

请告诉我这是否适合您。

答案 6 :(得分:0)

谢谢大家&gt;&gt;在你和其他命令之间,我想出了这个

sed 's/position:[ ]*/\n/g' | sed -e 's/\/.*//

再次感谢!!!!

答案 7 :(得分:0)

使用parameter expansion而不产生外部流程:

$ foo="position: 170.198.19.170/net1
> position: 170.198.19.165/rxy
> position: take1234/net
> position: imwell/net3
> position: xyz/444
> position: 170.198.82.142/net
> position: whoareu/net"

$ echo "${foo//position: /}"
170.198.19.170/net1
170.198.19.165/rxy
take1234/net
imwell/net3
xyz/444
170.198.82.142/net
whoareu/net