Необходимо получить данные между символом тильды - PullRequest
0 голосов
/ 07 сентября 2011

Может кто-нибудь посоветовать, как искать в linux некоторые данные между символом тильды.Мне нужно получить данные IP, однако они были сформированы, как показано ниже.

Details:
20110906000418~118.221.246.17~DATA~DATA~DATA

Ответы [ 6 ]

1 голос
/ 08 сентября 2011

Просто используйте 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
1 голос
/ 07 сентября 2011

В awk:

echo '20110906000418~118.221.246.17~DATA~DATA~DATA' | awk -F~ '{print $2}'
1 голос
/ 07 сентября 2011

Еще один:

echo '20110906000418~118.221.246.17~DATA~DATA~DATA' | sed -r 's/[^~]*~([^~]+)~.*/\1/'
1 голос
/ 07 сентября 2011

С 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 }'
1 голос
/ 07 сентября 2011
echo "20110906000418~118.221.246.17~DATA~DATA~DATA" | cut -d'~' -f2

При этом используется команда cut с разделителем, установленным на ~.Переключатель -f2 затем выводит только второе поле.

Если текст, который вы вводите, находится в файле (называемом filename), попробуйте:

grep "[0-9]*~" filename | cut -d'~' -f2
0 голосов
/ 08 сентября 2011

еще один, используя perl:

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

bash:

#!/bin/bash
IFS='~'

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

Если строка постоянная, то при раскрытии строки выполняется следующее расширение:

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