需要在波形符之间抓取数据

时间:2011-09-07 09:00:21

标签: linux sed awk grep

任何人都可以建议如何在linux上搜索波形符号之间的某些数据。我需要获取IP数据,但它的形成如下所示。

Details:
20110906000418~118.221.246.17~DATA~DATA~DATA

6 个答案:

答案 0 :(得分:1)

echo "20110906000418~118.221.246.17~DATA~DATA~DATA" | cut -d'~' -f2

这使用cut命令,并将分隔符设置为~。然后-f2开关只输出第二个字段。

如果您提供的文字位于文件(称为filename)中,请尝试:

grep "[0-9]*~" filename | cut -d'~' -f2

答案 1 :(得分:1)

cut

 echo "20110906000418~118.221.246.17~DATA~DATA~DATA" | cut -d~ -f2


使用 awk

 echo "20110906000418~118.221.246.17~DATA~DATA~DATA" 
       | awk -F~ '{ print $2 }'

答案 2 :(得分:1)

还有一个:

echo '20110906000418~118.221.246.17~DATA~DATA~DATA' | sed -r 's/[^~]*~([^~]+)~.*/\1/'

答案 3 :(得分:1)

在awk中:

echo '20110906000418~118.221.246.17~DATA~DATA~DATA' | awk -F~ '{print $2}'

答案 4 :(得分:1)

只需使用bash

$ string="20110906000418~118.221.246.17~DATA~DATA~DATA"
$ echo ${string#*~}
118.221.246.17~DATA~DATA~DATA
$ string=${string#*~}
$ echo ${string%%~*}
118.221.246.17

答案 5 :(得分:0)

另外一个,使用perl:

$ perl -F~ -lane 'print $F[1]' <<< '20110906000418~118.221.246.17~DATA~DATA~DATA'
118.221.246.17

击:

#!/bin/bash
IFS='~'

while read -a array;
do
    echo ${array[1]}
done < ip

如果string是常量,则以下参数扩展执行子串提取:

$ a=20110906000418~118.221.246.17~DATA~DATA~DATA
$ echo ${a:15:14}
118.221.246.17

或在bash中使用正则表达式:

$ echo $(expr "$a" : '[^~]*~\([^~]*\)~.*')
118.221.246.17

最后一个,再次使用纯粹的bash方法:

$ tmp=${a#*~}
$ echo $tmp
118.221.246.17~DATA~DATA~DATA
$ echo ${tmp%%~*}
118.221.246.17