Intereting Posts
Поиск файлов, которые были изменены с помощью скрипта? Наследование переменных среды в systemd Контейнер докеров Почему у вас много счетов? Я единственный пользователь Использование gdb для проверки переменных среды Планирование распространения на основе Ubuntu: SKEL не может быть прочитан обычным пользователем внутри живой системы конкатенация строк на основе первого символа следующей строки найти файл, скопировать, но с другим именем Linux: что есть на каждом из моих жестких дисков Как использовать инструмент diff, чтобы получить разницу между каталогами с библиотеками и источником? Linux Mint 18: сетевой менеджер, не показывающий точки доступа Wi-Fi Запуск firefox на удаленном хосте (через ssh) открывает новое окно локально: что происходит? Установить каталог на корневой каталог Kali Linux: apt-get update возвращает ошибку «Ошибка хэш-суммы» Получу ли я критические обновления безопасности, если я заблокирую CentOS yum для конкретной версии репо? Каков источник «скомпилировать его самостоятельно» в linux

Удалите несколько строк из файла, используя grep

У меня есть файл с несколькими строками, который выглядит так:

марка, модель, дюймы, цена

dell xps 13 9000 macbook pro 13 13000 asus zenbook 13 10500 

Я хочу удалить строки, где цена более 10000. Я новичок в bash-скриптах, и я хочу спросить, возможно ли это с помощью grep?

Вы можете использовать следующие, чтобы получить линии, где цена больше 10000:

 $ grep -E '.* [0]*[1-9][0-9]{4,}$' file.txt macbook pro 13 13000 asus zenbook 13 10500 

Если вы хотите удалить эти строки, добавьте -v :

 $ grep -vE '.* [0]*[1-9][0-9]{4,}$' file.txt dell xps 13 9000 
  • .* будет соответствовать всем символам до последнего столбца, содержащего цены

  • [1-9] будет соответствовать первой цифре цены

  • [0-9]{4,}$ будет соответствовать 4 или более цифрам после первой цифры, поэтому мы имеем в общей сложности пять цифр, что означает 10000 или более

Это возможно, но grep использует регулярные выражения, которые работают с строками, а не с числами.

 grep -v '[0-9]\{5\}$' input.txt 

-v удаляет совпадающие строки. [0-9] соответствует любой цифре, \{n\} означает, что предыдущая вещь повторяется n раз (5 раз в этом случае, то есть 10000 и более). $ соответствует концу строки.

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

 awk '$4<10000{print}' input.txt 

или Perl:

 perl -ane 'print if $F[-1] < 10000' input.txt 

Учитывая ваш пример ввода:

 $ cat /tmp/foo dell xps 13 9000 macbook pro 13 13000 asus zenbook 13 10500 

Вы можете использовать awk:

 $ awk '{ if ($4 <= 10000) print; }' /tmp/foo dell xps 13 9000 

пытаться

 cp input.txt original.txt awk 'NR==1 || $4 < 10000 ' original.txt > input.txt 

где

  • условие с NR == 1 для сохранения строки заголовка.