LINUX.ORG.RU
ФорумAdmin

grep : множественные шаблоны ...?

 


0

1

Приветствую! Мне надо бы определить какие файлы в текущем каталоге соответствуют некоторым шаблонам, и вывести их список.

попробовал такую конструкцию:

ls -1 | grep -vF "*OPMET*-ia5 | Z_*ana_bwk_na_N*.png| Z_*ana_bwk_dwda*.png| Z_*ana_bwkman_dwdna*| Z_*ana_bwkman_dwdc*| Z_*EDZW*_nwv01*_p00_na_N*WV11.png| \
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png| Z_*nwv01*_hsy_NA*.png| Z_*EDZW_*_htp_na_N_*_WV11SW.png| Z_*_rft_na_*.png| \
Z_*_r12*| Z_*_r24*| Z_*EDZW*_tkb_na*WV12.png| Z_*ecmwf*| Z_*EDZW*meg_26422*.png| ps401-pro_zwk_eu_p_*| \
Z_*EDZW*waf_swc_eur_*_EGRR.png| A_PWDE*EDZW_*.png| Z_*EDZW*egrr_bhv_nt_p_000024_000500*.tiff| \
Z_*EDZW*egrr_bwk_nt_p_000000_000000*.tiff| Z_*grb02-gme_hptuw*.tar| *grb02-lm_lm2* " |tee -a /dwd_ftp_log.txt

но оно, похоже, не принимает во внимание экстеншенов: к примеру в выводе попадаются

Z__C_EDZW_201712110105_gts88,synop_bufr_999999_999999__MW-220.bin
Z__C_EDZW_201712110627_gts88,synop_bufr_999999_999999__MW-221.bin
Z__C_EDZW_201712111131_gts88,synop_bufr_999999_999999__MW-222.bin
Z__C_EDZW_20171220110105_bda01,synop_bufr_999999_999999__MW_966.bin
Z__C_EDZW_20171220110405_bda01,ship_bufr_999999_999999__MW_983.bin
Z__C_EDZW_20171220110537_bda01,synop_bufr_GER_999999_999999__MW_943.bin

хотя в шаблонах на маски EDZW используются только расширения .png и tiff, но никак не .bin...?

пожалуйста, помогите, я уже полдня тут трахаюсь, варианты перебираю и экспериментирую, но ничего хорошего не достиг :((

У тебя -vF в ключах grep-а. -v — отрицание = «вывести все, кроме сматчившегося». -F — интерпретировать выражение как строку. И свои .bin-ы ты получаешь, потому что в их именах нету перечисленных тобой подстрок.

Так что если тебе, скажем, надо вывести файлы, совпадающие с маской *OPMET*-ia2 или Z_*ana_bwk_na_N*.png, то нужно написать правильные регулярные выражения и задать индивидуальные выражение через множественные ключики «-e» — не рекомендую городить портянку из «|»:

ls | grep -e 'OPMET.*-ia2$' -e '^Z_.*ana_bwk_na_N.*\.png$' ...

kawaii_neko ★★★★
()

Вместо звёздочки нужно вставить «любой символ в любом количестве» т.е. .*

Pyzia ★★★★★
()

Когда ж вы научитесь для примера давать не ваши говноданные, на которых глаза ломать от ненужности для всех остальных кроме ваc? Глядишь по принципу «в хорошем вопросе половина ответа» и увидели б, что на самом деле не так делали. Если вам действительно надо список файлов и вам по душе glob-маски, то так и пишите «ls -1 *.ex1 *.ex2 ...» - делов то.

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

Когда ж вы научитесь для примера

да кто ж меня, дурака, научит? :\

по вашему совету  - целыми кучами вываливает в результате 
ls:cannot stat *.ex1: no such file or directory

но чтото из файлов по шаблону вроде тоже выводит.
как сии сообщения убрать можно?

да, каталог не всегда содержит файлы соответствующие шаблонам, вестимо...
wisedraco ★★
() автор топика
Ответ на: комментарий от Pyzia

Вместо звёздочки нужно вставить «любой символ в любом количестве» т.е. .*

както туго я соображаю - вместо звёздочки использовать звёздочку?:-O

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

елыми кучами вываливает в результате
ls:cannot stat *.ex1: no such file or directory
да, каталог не всегда содержит файлы соответствующие шаблонам, вестимо...

Это нормально. Оно вываливается в stderr, потому не мешает получить список того, что есть. Загасить «вываливание» тоже просто: 2> /dev/null

както туго я соображаю - вместо звёздочки использовать звёздочку?:-O

Почитайте google: Regular expressions VS Filename globbing

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

гран мерси! просто и изящно! завтра погоняю, проверю, надеюсь сиё решение действительно будет правильно работать... :)

2 kawaii_neko: переписал по вашему, аж умаялся - нифига, «правильный файл» в каталоге есть, но запрос его не показывает... можт, конечно, я чтото напутал, но...

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

всё равно не понял: * и .* - вещи, понятно, разные, и если поставлено * а не .*, то ваш совет ничего хорошего, имхо не даст...?

2vodz: почитаю для общего развития, но если глоббинг - это маски, как у меня в этом исходном примере, а экспрешшны - это как header /^Received$/ /\[195\.129\.5[89]\..*\]/

то экспрешшны - они явно не людьми и не для людей придуманы, имхо. комп должен быть инструментом по возможности простым, элементарным и легкопонятным, а не быть самоцелью и искусственно максимально усложнённым...

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

кстати, не подскажешь ли ещё, пожалуйста:

у меня есть ещё такой вот кусок в скрипте. понятно, он тоже в консоль выкидывает сообщения о том что соответствующие маски не найдены, если файла соответствующего шаблону, при очередном прогоне, не найдено.

куда тут присобачить 2> /dev/null?

пробовал, по логике, в конце строки mv $files - нифига.... :\

    while read files; do
        mv $files /stuff/DWD_sorted/
    done <<____
	*OPMET*-ia5 
	Z_*ana_bwk_na_N*.png
	Z_*ana_bwk_dwda*.png
	Z_*ana_bwkman_dwdna*
	Z_*ana_bwkman_dwdc*
	Z_*EDZW*_nwv01*_p00_na_N*WV11.png
	Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
	Z_*nwv01*_hsy_NA*.png
	Z_*EDZW_*_htp_na_N_*_WV11SW.png
	Z_*_rft_na_*.png
____
wisedraco ★★
() автор топика
Ответ на: комментарий от vodz

это "-f" крайне непонятно мне, что делает, но верю и спасибо - так оно да, изящнее выглядит, но всётаки, если можно, я был бы рад за подсказку, как на вышеприведённом примере таки убрать сообщения о ненайденных файлах...?;) спасибо заранее...

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

это "-f" крайне непонятно мне, что делает,

man test

как на вышеприведённом примере таки убрать сообщения о ненайденных файлах

сообщения пишет mv, ему вместо файла подают в качестве аргумента неразвернувшуюся маску. Если оставить за скобками вообще проблемы такого подхода с пробелами в именах, то можно либо вставить в само mv 2> /dev/null, либо тоже самое добавить с [ -f ... ]

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

мне аж интересно стало:

mv 2> /dev/null $files /stuff/DWD_sorted/

mv $files /stuff/DWD_sorted/ 2> /dev/null

- всё едино, выводит mv: cannot stat 'Z_*ana_bwkman_dwdc*' no such file or directory

хотя - не должен ведь, перенаправление вывода ж должно работать?

чтото я тут сильно непонимаю....:\

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

чтото я тут сильно непонимаю....:\

Я тоже, должно и УМВР.

Кстати, с [-f ... ] в вашем случае как раз работать не будет для маски, где найдётся несколько файлов, так как будет произведена проверка c «file1 file2», что естественно такое не годится.

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

всё едино, выводит mv: cannot stat 'Z_*ana_bwkman_dwdc*' no such file or directory

а 2>&- ?

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

сорри, всё работает таки с перенаправлением вывода - эт я, старый дурак, не принял во внимание что после вышеприведённого куска в скрипте у меня идёт похожее, но более мелкое перераспределение по отдельным каталогам - оно то и ругалось. добавил и туда 2> /dev/null, теперь тишина. буду пилить свой мегаскрипт дальше, спасибо за помощь, и удачного дня ! :)

2teodor : - спасибо и тебе, добрый человек! :)

у нас щас снег лежит, щас пошкандыбаю на лисапеде в другой конец города - в интернетмагазин пришёл обод, который я заказал в рамках конверсии лисапеда в электролисапед... надоело педали крутить, да и старость - не радость...:D

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

то экспрешшны - они явно не людьми и не для людей придуманы

Для людей. Обычные люди не так часто ищут ip адреса или полное совпадение строки.

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