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


              Рейтинг@Mail.ru
              [ Script execution time: 0,0300 ]   [ 16 queries used ]   [ Generated: 28.03.24, 09:06 GMT ]