簡體   English   中英

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

[英]Sed / Awk parsing lines between certain charcters

我很難解析以下內容:

當前分配給變量的信息是:

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替換,但沒有得到。

預先感謝你

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

假設您的數據在一個名為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 (需要 > = 4.0)和結果數組元素上的參數擴展的一種有趣的純bash方式。 最終結果是數組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
$ 

嘗試類似:

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

會成功的。

如何運作?

  1. position:轉換為換行符。
  2. 卸下一切超出/ 一條線上。
  3. 刪除空行。

您將得到想要的。

要理解為什么這樣做 ,請注意OP最初將以下內容作為輸入:

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

比現在相對瑣碎的輸入要難得多。

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'將起作用。 這里t是存儲模式的文件的名稱。

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

有很多方法可以給這只貓蒙皮。

嘗試這個:

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

這是更新的答案,其中“位置:”僅在ethe行上出現一次,而我沒有使用cut做到了

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

讓我知道這是否適合您。

謝謝大家>>在您的命令和其他命令之間,我想到了這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM