grep с использованием файла

grep с использованием файла

У меня есть 2 файла, и я хочу найти разницу и вывести только то, чего нет в ex2

Если использовать grep -Ff ex2.txt ex1.txt, он мне показывает a b c d, если я использую ту же команду с -vнет вывода. Почему с первая команда тоже выводит d?

Какой самый простой способ это сделать? Подойдет ли grep для этого? Может быть, diff, может быть, скрипт, который будет читать каждую строку и выводить, есть она там или нет?

cat ex1.txt
a
b
c
d

cat ex2.txt
a
b
c

Редактировать — мой вывод выглядит так:

cat ex2.txt
a
b
c

cat ex1.txt
a
b
c
d

grep -vf ex2.txt ex1.txt

grep -f ex2.txt ex1.txt
a
b
c
d

решение1

grepна самом деле не совсем подходящий инструмент для данной работы, но быстрый взгляд на него grep manpageдолжен помочь (обратите внимание, что он grepбудет немного отличаться в зависимости от дистрибутивов, так как некоторые могут использовать GNU по умолчанию, а другие могут использовать что-то другое).

  • -F ... Фиксированные строки (разделенные символами новой строки) - (Категория: выбор сопоставителя)
  • -f ... Имя файла (Категория: контроль соответствия)
  • -v ... Инвертировать соответствие (Категория: управление соответствием)

Итак, вы можете представить, что что-то вроде этого grep -Fvf ex2.txt ex1.txtсработает. Однако,это не хорошее решение, так как это требует от вас уже знать что-то о файлах до начала. Существуют лучшие инструменты (например, варианты diff), которые дадут вам более конкретные и точные различия между файлами и/или каталогами.

Редактировать: Исправлены строки, а не строки Fire (к черту автоповреждение)

решение2

Попробуйте изменить порядок файлов:

grep -v -f ex2.txt ex1.txt
> d

решение3

Невозможно воспроизвести вашу ошибку:

cat ex2.txt 
a
b
c

cat ex1.txt 
a
b
c
d

grep -vf ex2.txt ex1.txt 
d

grep -f ex2.txt ex1.txt 
a
b
c

grep -Ff ex2.txt ex1.txt 
a
b
c

grep -vFf ex2.txt ex1.txt 
d

grep -V
grep (GNU grep) 2.20

lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.5 (jessie)
Release:    8.5
Codename:   jessie


Редактировать(в OS X с BSD grep):

cat ex2.txt 
a
b
c

cat ex1.txt 
a
b
c
d

grep -f ex2.txt ex1.txt 
a
b
c

grep -vf ex2.txt ex1.txt 
d

grep -Ff ex2.txt ex1.txt 
a
b
c

grep -v -Ff ex2.txt ex1.txt 
d

grep -V
grep (BSD grep) 2.5.1-FreeBSD

Связанный контент