某些字符之间的 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

我想打印"Position:"和斜杠"/"减去空格之间的所有字符并将它们打印在新行上

所以最终结果应该是:

170.198.19.170
170.198.19.16
take1234
imwell
xyz  
170.198.82.142
whoareu

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

提前感谢你

使用 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

尝试类似操作:

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

假设您的数据位于名为 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
$ 

一种有趣的纯 bash 方法,使用 mapfile(需要 bash>= 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 变量在两者上分离并awk

$ 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
$ 

可能是最短的cut

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

试试这个:

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

这是更新的答案,其中"位置:"仅在行上出现一次,我在不使用position:的情况下做到

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

让我知道这是否适合您。

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

会做这个伎俩。

这是怎么回事?

  1. /转换为换行符。
  2. 删除行cut -f2 -d' ' t|sed 's_/[a-zA-Z0-9[:punct:]]*__g'以外的所有内容。
  3. 删除空行。

你得到你想要的。

为了理解为什么这样做,请注意OP最初将以下内容作为输入:

位置:170.198.19.170/

net1 位置:170.198.19.165/RXY 位置: 取1234/净仓位: IMWELL/净3仓位: XYZ/444仓位: 170.198.82.142/净仓位: 谁/净仓位:

使其比现在相对微不足道的输入困难得多

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$ 

对于更新的输入t将起作用。这里CC_13是存储模式的文件的名称。

使用 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 '/^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
$

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

谢谢大家>> 在你们命令和其他命令之间,我想出了这个

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

所以再次感谢!!!

在不生成外部进程的情况下使用参数扩展:

$ 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

相关内容

  • 没有找到相关文章

最新更新