2015-10-15 4 views
3

Я пытаюсь найти две строки в одной строке. Ниже приведен пример строки.Grep более одной строки в одной строке

line1: xxxx yyyy time1-12 zzzz time2-13 
line2: xxxx yyyy time1-14 zzzz time2-15 

Я использую команду ниже Grep для достижения этой

grep -o -E 'time1-[0-9]*|time2-[0-9]*' timetest.txt 

Это дает мне выход в

time1-12 
time2-13 
time1-14 
time2-15 

Но я хочу, как этот

time1-12 time2-13 
time1-14 time2-15 

Что мне здесь не хватает? Могу ли я пойти на AWK или СЭД для получения этого выходного

+1

попытка 'AWK«{печать $ 4 „“ $ 6}»timetest.tx t' –

ответ

3

С GNU AWK для 3-арг, чтобы соответствовать():

$ awk 'match($0,/time1-[0-9]*/,a) && match($0,/time2-[0-9]*/,b) { print a[0], b[0] }' file 
time1-12 time2-13 
time1-14 time2-15 

Обратите внимание, что time1 и time2 может быть в любом порядке на линии. С другой awks вам нужно использовать SUBSTR() для извлечения спички() Результаты:

$ awk 'match($0,/time1-[0-9]*/) && (a=substr($0,RSTART,RLENGTH)) && match($0,/time2-[0-9]*/) { print a, substr($0,RSTART,RLENGTH) }' file 
time1-12 time2-13 
time1-14 time2-15 

Если 2 раза всегда в том же порядке, то с простака вы могли бы сделать:

$ awk 'match($0,/(time1-[0-9]*).*(time2-[0-9]*)/,a) { print a[1], a[2] }' file 
time1-12 time2-13 
time1-14 time2-15 

но то это всего лишь простая замена на отдельной линии, так что вы можете также просто использовать СЕПГ:

$ sed -r 's/.*(time1-[0-9]*).*(time2-[0-9]*).*/\1 \2/' file 
time1-12 time2-13 
time1-14 time2-15 
1

Perl на помощь:

perl -lne 'print "$1 $2" if /(time1-[0-9]+).*(time2-[0-9]+)/' timetest.txt 

код предполагает time1 приходит всегда перед time2.

1

Попробуйте патч в следующей команде,

sed 's/[^t]\+\(time[^ ]\+\)/\1 /g' FileName 

или

sed 's/[^t]\+\(time\(1\|2\)[^ ]\+\)/\1 /g' FileName 

Выход:

time1-12 time2-13 
time1-14 time2-15 

Cut версия

cut -d" " -f 4,6 FileName 
+0

Это просто печатает конец любой строки, содержащей строку, начинающуюся с 'time', она не ищет 2 специальных регулярных выражения, о которых заботится OP. –

+0

@EdMorton, я получил вашу точку зрения, см. Мой обновленный ответ ... – Kalanidhi

1

Другое решение, используя grep

grep -o -E 'time[0-9]+-[0-9]+' timetest.txt | paste -d " " - - 

вы получите,

 
time1-12 time2-13 
time1-14 time2-15 
+0

Это было мое тоже.Только сложность: если в каждой строке нет двух совпадений, результат может объединять совпадения из разных строк. –

+0

в этом случае, лучше решение Каланидхи .... Я проголосую за этот ответ –

+0

Он также не будет соответствовать 2 целевым регулярным выражениям, он будет соответствовать в любое время .... –

0
awk -vRS="time[12]-[0-9]+" '{$0=RT}1' filename 
time1-12 
time2-13 
time1-14 
time2-15 
Смежные вопросы