2013-08-10 2 views
3

Я хотел бы grep упорядочить несколько строк файла. Пример файла originalfile.txt может быть:grepping несколько строк из файла

num=12 
workers not specified 
length= 128 
Using array element 
num= 24 
workers not specified 
length= 128 
Using array element 
...... 

Я хочу grep только ценные линии, как все те, с num и length:

num=12 
length= 128 
num= 24 
length= 128 
...... 

Я знаю, как grep всего за один шаблон, скажем, num, но я не знаю, как это сделать для нескольких шаблонов.

$ grep "num" originalfile.txt 

Оказывается, что у меня есть некоторые параметры в той же строке, что awk, кажется, не найти, то есть:

.... time= 1.234 Gflop/s= 3.4556 .....

фильтрует первый, но не Gflop/с. Есть ли способ вернуться на одну строку?

ответ

4

Используйте -E вариант

От man grep:

-E, --extended-регулярное_выражение

Интерпретируйте ОБРАЗЕЦ как расширенное регулярное выражение (см ниже).

$ grep -E 'length|num' data 
num=12 
length= 128 
num= 24 
length= 128 

Update, если вы хотите только получить номера вы можете трубы к awk

grep -E 'length|num' data | awk -F'= ?' '{print $2}' 

Но тогда вы можете сделать все это в команде signle AWK, и избежать Grep

awk -F'= ?' '/length/||/num/{print $2}' data 
+0

Это было полезно. Любая идея о том, как печатать только элемент после '=', т. Е. Просто цифры? – Manolete

+0

@Manolete Вы можете использовать awk для этого (прочитать обновление). – user000001

+0

Ваш скрипт 'awk' не учитывает пробел. –

3

Это должно сделать трюк:

$ grep '^\w*=' file 
num=12 
length= 128 
num= 24 
length= 128 

Объяснение:

^ # Start of line 
\w # Word class, shorthand for [a-zA-Z0-9_] 
* # Quantifier (zero or more) 
= # Equals character 

+ квантор, вероятно, лучше (один или несколько), который является частью ERE (Extended регулярных выражений), так что вы» d необходимо использовать egrep (grep -E). Это означает, что строки, начинающиеся с =, и имя переменной не будут сопоставляться.

$ egrep '^\w+=' file 
num=12 
length= 128 
num= 24 
length= 128 

Edit:

Для вас вопрос второстепенный найти в комментариях, только напечатать значение цифры, мы получаем в фантазии использования в grep:

$ grep -Po '^\w+=\s?\K\d+' file 
12 
128 
24 
128 

Или использовать язык сценариев подобные awk

$ awk -F'= ?' '/\w*=/{print $2}' file 
12 
128 
24 
128 
2

Grep позволяет использовать регулярное выражение. Мы можем использовать регулярное выражение с выражением «или» для поиска нескольких совпадений.

grep 'num=\|length=' file 

num=12 
length= 128 
num= 24 
length= 128 

0 | символ означает «или» в регулярном выражении. Поскольку это bash, нам нужно избегать | поэтому он становится \ |

+1

'bash' не имеет ничего общего с тем, почему вам нужно сбежать' '' потому что 'OR' является частью расширенных регулярных выражений и по умолчанию только' grep' использует Basic Regular Expression. Это расширение GNU, которое позволяет использовать ERE путем экранирования, поочередно бросать экранирование и использовать 'egrep/grep-E'. –

2

Вы также можете передать несколько шаблонов для Grep с -e опцией

grep -e num -e length 
Смежные вопросы