На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила трёх "С"
Пожалуйста,
1. Соблюдайте правила Форума.
2. Слушайте советы Модераторов.
(например, http://forum.sources.ru/index.php?act=ST&f=7&t=80382 )
3. Сверяйтесь с учебником по Великому и Могучему
Модераторы: JoeUser
  
> Чтение строк с файла в Linux, С отсутствующим текстом
Добрый день, всем!

Есть файл со строками:
ExpandedWrap disabled
    [20:17] 15 "HTTP/1.1" 15 1124
    [20:19] 15 "HTTP/1.0" 17 62646
    [21:30] 15 "HTTP/1.0" 16 51651
    [21:37] 15 "HTTP/1.1" 15 6152
    ...

Как вывести из файла все строки, не содержащие какую-то подстроку? Например, в данном случае "15" идущий 2й раз в строке. Пробовал
ExpandedWrap disabled
    $ grep -v 15 file.txt

но результат не тот, что ожидал.
Сейчас изменил на рег выр:
ExpandedWrap disabled
    $ grep -E "http\/1\.(1|0){1}\"\s((?!15)[0-9]*)\s\d+" file.txt

выдало сообщение:
ExpandedWrap disabled
    -bash: !15: event not found

Похоже, символ ! не нравится.
Сообщение отредактировано: Костик+ -
У меня получилось так
ExpandedWrap disabled
    cat file.txt | grep -v 15
С наилучшими пожеланиями,
Юрий Русинов.
Цитата YuriyRusinov @
У меня получилось так
ExpandedWrap disabled
    cat file.txt | grep -v 15

Изврат, зачем в пайпе передавать если это тоже самое. Вот так должно работать
ExpandedWrap disabled
    grep -v "15" file.txt

Если не работает, значит автор делает что-то не так, либо пример не соответствует тому что там у него на самом деле.
Сообщение отредактировано: Gonarh -
Да, прошу прощения - не корректно задал пример, т.к. сам по началу не разобрался в файле. Пример поправил.
Сообщение отредактировано: Костик+ -
Решил!

Вдруг кому-нибудь понадобится:
ExpandedWrap disabled
    $ grep -v -P "\"\s((15)[0-9]*)\s\d+" file.txt


Всем спасибо за помощь :)
Непонятно, зачем 15 взято в скобки, и почему вместо \d использовано [0-9]. Да и зачем вообще там скобки, тоже непонятно. Плюс после \d в конце тоже излишество

Вообще, я бы файл с такой структурой фильтровал бы не grep'ом, а при помощи awk. Awk разбивает строку на поля, поэтому можно было бы написать
ExpandedWrap disabled
    awk -- '$4 != 15 { print }' file.txt


Добавлено
Да, если там подразумевается не число 15, а строка, начинающаяся с 15, то придётся написать немного по-другому
ExpandedWrap disabled
    awk -- '$4 !~ /^15/ { print }' file.txt
Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,1052 ]   [ 19 queries used ]   [ Generated: 17.11.18, 15:31 GMT ]