I have file a and b and I would like to output lines of b that changed since it was cloned from a. Just the modified lines, no surrounding context, no diff offset marks.

How can I do that using shell scripting? (No Python/Perl/PHP/...)

Sed and awk are acceptable solutions.

For now, what I am doing is diff -y with --suppress-common-lines and sed using regex backreferences to just fetch the right part after the whitespace. There must be a better way?

Using perl (which is forbidden), I´d do something like this:

diff -y --suppress-common-lines -W $COLUMNS Eclipse_Preferences_Export_*.epf | perl -pe 's/.*\t|\t(.*)$/\1/g'

With GNU diffutils package's diff this will output only lines from file b which either were modified or newly inserted:

diff --unchanged-line-format= --old-line-format= --new-line-format='%L' a b
  • 6
    Awesome. Shame the info is buried in the Texinfo and no hint is provided in the man page I was reading.. – Robottinosino Nov 25 '12 at 15:05

You have to add one more option :

grep -vf file1 file2
  • 1
    While this doesn't require the lines to be sorted, I think grep uses a lot more memory and will crash for large files. – Sridhar Sarnobat Aug 17 '17 at 4:14
  • doesn't work if lines are duplicated either – Jayen Nov 2 '18 at 9:05
awk 'FNR==NR{old[$0];next};!($0 in old)' old.txt new.txt

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.