2 votes

grep de l'un mais pas de l'autre

Comment grep OUT le contenu d'un fichier à partir d'un autre fichier ?

Disons que j'ai un fichier "file1" et qu'il a

a
b
c

et un autre fichier "file2" qui a

a
b
c
d
e
f

Je faisais habituellement

cat file2 | grep -v a | grep -v b | grep -v c 

Y a-t-il un moyen de faire cela avec les fichiers

grep -v file2 file1

5voto

Nicole Hamilton Points 9675

Utilisez diff pour trouver les différences et sed pour sélectionner, formater et imprimer uniquement les lignes ajoutées :

diff file1 file2 | sed -n "/^>/{s/> //;p}"

Ajouté :

Si les fichiers sont dans des ordres différents, alors sort les deux d'abord, puis diff les.

sort file1 > file1.s
sort file2 > file2.s
diff file1.s file2.s | sed -n "/^>/{s/> //;p}"

Si vous utilisez bash vous pouvez utiliser <(...) la substitution de processus :

diff <(sort file1) <(sort file2) | sed -n "/^>/{s/> //;p}"

2voto

Mohsin Points 11

GNU grep (et j'imagine que d'autres aussi) peut prendre le format -f option :

   -f FILE, --file=FILE
          Obtain patterns from FILE, one  per  line.   The  empty
          file  contains  zero  patterns,  and  therefore matches
          nothing.  (-f is specified by POSIX.)

Donc, tu pourrais faire ça :

grep -vFf file1 file2 

Suivant Nicole Hamilton suggestion dans les commentaires, j'ai ajouté l'option '-F' qui permet à grep d'interpréter son PATTERN (dans ce cas, chaque ligne de file1) comme des chaînes fixes et non comme des expressions régulières :

  -F, --fixed-strings
          Interpret PATTERN as  a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which  is to be matched.  (-F is specified by
          POSIX.)

J'ai également écrit un PERL script avec quelques options supplémentaires :

$ list_compare.pl -h

  USAGE: compare_lists.pl FILE1 FILE2

  This script will compare FILE1 and FILE2, searching for the 
  contents of FILE1 in FILE2 (and NOT vice-versa). FILE one must 
  be one search pattern per line, the search pattern need only be 
  contained within one of the lines of FILE2.

OPTIONS: 
  -c : Print patterns COMMON to both files
  -f : Search only the first characters (until the 1st space) of each line of 
       FILE2 for the search pattern given in FILE1. So, if FILE1 contains
       "foo bar", only "foo" will be taken as a pattern (MUCH faster).
  -d : Print duplicate entries     
  -m : Print patterns MISSING in FILE2 (default)
  -h : Print this help and exit

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X