LINUX.ORG.RU
решено ФорумAdmin

grep по двум значениям


0

1

Добрый день,

не соображу как грепнуть файл.Есть две переменные в них записываются два числа, например:

a=5
b=4

и есть файл вида:

4869    23552   1       256000  2014-03-08 19:30:43     45      2
38278   22504   1       256000  2014-01-19 19:50:13     45      2
4834    3105    1       1048576 2011-10-17 15:34:44     45      1
9565    22825   1       512000  2014-02-02 19:40:49     45      2
8149    22623   1       256000  2014-01-26 15:13:39     45      2
5       4       1       256000  2010-09-26 13:14:18     45      1
549	276	1	256000	2010-12-25 23:13:06	45	2
541	270	1	256000	2014-10-31 10:00:09	45	2
5447	3578	1	1048576	2014-10-23 19:49:19	45	1
541	263	1	256000	2014-10-31 10:00:05	45	2
541	2455	1	256000	2014-06-26 10:00:03	45	2
54400	30465	1	1048576	2014-01-02 15:47:00	45	1
5420	3537	1	1048576	2012-09-19 16:37:52	45	1
541	272	1	1048576	2014-10-31 10:00:10	45	1
5405	24005	1	1048576	2014-04-02 15:00:07	45	1
541	269	1	256000	2014-10-31 10:00:08	45	2
546	274	1	256000	2010-12-25 20:36:53	45	2
54	77	1	256000	2010-11-17 12:59:04	45	2
541	266	1	256000	2014-10-31 10:00:07	45	2
543	271	1	256000	2010-12-25 19:18:10	45	2

надо, грепнуть все строки в которых в первой колонке будет переменная «а» и во второй «b».В данном примере только одна строка должна быть в результате:

5       4       1       256000  2010-09-26 13:14:18     45      1
Пробовал вот так:
grep "^$a.*$b" filename.txt, но все равно попадают строки, вида:

5405	24005	1	1048576	2014-04-02 15:00:07	45	1
,где есть и 5 и 4.

Ответ на: комментарий от anarquista

Тогда попадает вот такая строка:

54	77	1	256000	2010-11-17 12:59:04	45	2

Funny_sailor
() автор топика
Ответ на: комментарий от sdio

awk '$1 == 5 && $2 == 4' Самый правильный вариант, игры с grep/sed в данном случае тупость.

а что у тебя awk, а не C#? Как жиденько...

emulek
()
Ответ на: комментарий от sdio

Поясню: по условию надо проверять столбцы (поля), т.е. split & compare логичнее, быстрее и читабельнее, чем регексп.

Впрочем это и так понятно грамотным людям.

sdio ★★★★★
()
Ответ на: комментарий от sdio

Поясню: по условию надо проверять столбцы (поля), т.е. split & compare логичнее, быстрее и читабельнее, чем регексп.

вот на счёт «быстрее» попытайся доказать.

логичнее/читабельнее — вопрос привычки. Не принимается.

Впрочем это и так понятно грамотным людям.

грамотному человеку ничего не стоит аргументировать свою т.з.

emulek
()
Ответ на: комментарий от emulek

Охх. Беру слова назад. Прочитал, что в первой колонке должно быть либо $a либо $b.

generator ★★★
()
Ответ на: комментарий от emulek

Не поленишься написать регексп для аналогичной задачи, но для проверки 4-го и 7-го столбцов, например, тогда и поговорим.

sdio ★★★★★
()
Ответ на: комментарий от sdio

но для проверки 4-го и 7-го столбцов,

(\S+\s+){3}(\S+\s+)

(\S+\s+){6}(\S+\s+)

emulek
()
Ответ на: комментарий от anonymous

При выполнении некоего условия «print $0» акция по умолчанию, так что писать её необязательно - см. выше.

berrywizard ★★★★★
()
Ответ на: комментарий от emulek

CentOS 5/x86_64, 10 прогонов, I блок - «grep -E», II - «awk»:

real   0m8.456s  0m8.266s  0m8.384s  0m8.390s  0m8.430s  0m8.412s  0m8.318s  0m8.464s  0m8.343s  0m8.358s
user   0m8.101s  0m8.145s  0m8.193s  0m8.105s  0m8.113s  0m8.169s  0m8.169s  0m8.141s  0m8.153s  0m8.149s
sys    0m0.092s  0m0.020s  0m0.036s  0m0.080s  0m0.084s  0m0.020s  0m0.048s  0m0.044s  0m0.020s  0m0.072s

real   0m0.798s  0m0.755s  0m0.729s  0m0.766s  0m0.735s  0m0.727s  0m0.738s  0m0.731s  0m0.807s  0m0.739s
user   0m0.592s  0m0.656s  0m0.632s  0m0.620s  0m0.648s  0m0.652s  0m0.648s  0m0.620s  0m0.632s  0m0.616s
sys    0m0.128s  0m0.076s  0m0.088s  0m0.112s  0m0.072s  0m0.068s  0m0.064s  0m0.100s  0m0.092s  0m0.112s

Плюс, «\s» grep не понял, только «[[:space:]]», плюс, не очень понятно, у ТС первые 2 колонки целочисленные или не обязательно, и во втором случае grep выдаст феерию в случае, поиска, например, «2.8».

berrywizard ★★★★★
()
Ответ на: комментарий от berrywizard

Плюс, «\s» grep не понял, только «[[:space:]]»

надо было sed. Ну и пример искусственный, IRL в столбцах что-то есть, что нужно тоже фильтровать (имя юзера и т.п.)

grep выдаст феерию в случае, поиска, например, «2.8».

потому что точка матчится с любым символом. Надо искать «2\.8».

emulek
()
Ответ на: комментарий от berrywizard

Ну так и стоит оно (искейпить переменные) ради десятикратного замедления скорости работы?

ЩИТО? Переменные не имеют никакого отношения к grep, их работает оболочка, а grep жрёт as is.

Если ты намекаешь на длину регулярки, то она тоже не имеет никакого значения. Регулярки == ЯП. Причём компилируемый. Т.е. grep сначала ОДИН раз компилирует регулярку, а потом выполняет её для каждой строки. Т.о. регулярка 2.2 срабатывает медленнее 2\.2, ибо первая является нечёткой. Мало того, размер «точки» может составлять 1,2,3 и даже больше байт.

Так во всяком случае в glibc. А теперь наверное и в grep(с 2.17). Я не смотрел сырцы 2.17.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.