0

次のテキストを含む2つのファイルがあります。

古いファイル:

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_livecd-lv_root
                       18G  2.4G   15G  14% /
tmpfs                 590M  276K  590M   1% /dev/shm
/dev/sda1             485M   31M  429M   7% /boot

新規ファイル

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_livecd-lv_root
                       18G  2.7G   15G  14% /
tmpfs                 590M  264K  590M   1% /dev/shm
/dev/sda1             485M   31M  429M   7% /boot
/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

出力ファイルでは、次の行が必要です。新しく追加されたので。

/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

しかし、代わりに、1 つの数値も 2.4 から 2.7 に変更されているため、次の出力が得られます。

                        18G  2.7G   15G  14% /
/dev/sdb1             3.8G  1.1G  2.8G  28% /media/9C6F-1ECD

これは私にとって問題を引き起こしています。完全に新しく追加された行が欲しいだけです。

4

3 に答える 3

0

類似点がない行のみを検索します

diff -y --suppress-common-lines /yourfile1 /yourfile2 | grep "<" | sed 's/  .*//g'
于 2012-04-17T16:51:52.190 に答える
0

This may get you close to what you want,

diff -y --suppress-common-lines oldfile newfile

The main problem is that it also includes the small changes that you want to exclude. If it's safe to assume that lines with small changes will not include '|' surrounded by whitespace, then we can delete the corresponding diff output to leave only those lines that are added or removed.

diff -y --suppress-common-lines oldfile newfile | sed '/[ TAB][ TAB]*|[ TAB][ TAB]*/ d'

where "TAB" should be the tab character.

This will show lines added and removed with an important limitation: If a line addition and deletion are adjacent, diff will report a changed line (with the '|') and this output will be discarded by the sed filter.

If you need the added/removed lines to appear as they do in the files, you can remove the < and > from the diff output using additional sed commands. For example, to get rid of the > indicating a line addition:

diff -y --suppress-common-lines oldfile newfile | sed -e '/[ TAB][ TAB]*|[ TAB][ TAB]*/ d' -e 's/^[ TAB][ TAB]*>[ TAB][ TAB]*\(.*$\)/\1/'

But note that this will also remove any leading whitespace from the line.

于 2012-04-17T15:48:29.550 に答える
0

まず、比較たい部分を最後に置きます。

df -P | awk 'NR > 1 {print $1 ":" $6 "\t" $0 }' | sort >comm-test.1
df -P | awk 'NR > 1 {print $1 ":" $6 "\t" $0 }' | sort >comm-test.2

それで:

join -t $'\t' -j 1 -o 2.2 \
  <(comm -13 \
     <(cut -f1 comm-test.1) \
     <(cut -f1 comm-test.2)) \
  comm-test.2

df -Pdf からの出力が複数の行に分割されないようにするための使用に注意してください(例のように)。

ところで、あなたの問題を覆い隠すことは非常に役に立ちませんでした。今後はこれを行わないでください。

于 2012-04-17T22:10:31.393 に答える