linux command

diff

Linux Command – diff ใช้ในวิเคราะห์เปรียบเทียบ file 2 file ทีละบรรทัด ว่ามีบรรทัดไหนบ้างที่หายไป ของแต่ละ file

 

คำสั่ง

จากตัวอย่าง file1 และ file2 ที่จะใช้ diff ในการตรวจสอบ

$ cat file1
aaaaaaaaaaa
bbbbbbbbbbb
ccccccccccc
ddddddddddd
eeeeeeeeeee
fffffffffff
ggggggggggg

$ cat file2
aaaaaaaaaaa
22222222222
ccccccccccc
zzzzzzzzzzz
xxxxxxxxxxx
33333333333
ddddddddddd

$ diff file1 file2
2c2
< bbbbbbbbbbb
---
> 22222222222
3a4,6
> zzzzzzzzzzz
> xxxxxxxxxxx
> 33333333333
5,7d7
< eeeeeeeeeee
< fffffffffff
< ggggggggggg

จาดผลลัพธ์สิ่งที่ diff บอกคือ

2c2 คือ file1 บรรทัดที่ 2 ต้องเปลี่ยนให้เหมือนกับ file2 โดยเปลี่ยนจาก ‘bbbbbbbbbb’ เป็น ‘2222222222’

3a4,6 คือ file1 บรรทัดที่ 3 ต้องเพิ่มบรรทัดที่ 4-6 ให้เหมือนกับ file2 คือ ‘zzzzzzzzzz’,’xxxxxxxxxx’,’3333333333′

5,7d7 คือ file1 บรรทัดที่ 5-7 ต้องลบออก คือ ‘eeeeeeeeee’,’ffffffffff’,’gggggggggg’ เพื่อให้ตรงกับบรรทัดที่ 7

 

โครงสร้างคำสั่ง

diff [OPTION]... FILES

 

รายละเอียด

เป็นคำสั่งที่ใช้วิเคราะห์เปรียบเทียบ file 2 file ทีละบรรทัด ว่ามีบรรทัดไหนบ้างที่หายไป สิ่งที่ diff พยายามทำคือ ให้ข้อมูลที่สามารถทำให้ file ทั้ง 2 file มีข้อมูลเหมือนกันเช่น เพิ่มบรรทัดนี้ file นี้ หรือ แก้บรรทัดนี้ file นี้

 

Option

 Mandatory arguments to long options are mandatory for short options too.

 --normal
 output a normal diff (the default)

 -q, --brief
 report only when files differ

 -s, --report-identical-files
 report when two files are the same

 -c, -C NUM, --context[=NUM]
 output NUM (default 3) lines of copied context

 -u, -U NUM, --unified[=NUM]
 output NUM (default 3) lines of unified context

 -e, --ed
 output an ed script

 -n, --rcs
 output an RCS format diff

 -y, --side-by-side
 output in two columns

 -W, --width=NUM
 output at most NUM (default 130) print columns

 --left-column
 output only the left column of common lines

 --suppress-common-lines
 do not output common lines

 -p, --show-c-function
 show which C function each change is in

 -F, --show-function-line=RE
 show the most recent line matching RE

 --label LABEL
 use LABEL instead of file name (can be repeated)

 -t, --expand-tabs
 expand tabs to spaces in output

 -T, --initial-tab
 make tabs line up by prepending a tab

 --tabsize=NUM
 tab stops every NUM (default 8) print columns

 --suppress-blank-empty
 suppress space or tab before empty output lines

 -l, --paginate
 pass output through `pr' to paginate it

 -r, --recursive
 recursively compare any subdirectories found

 -N, --new-file
 treat absent files as empty

 --unidirectional-new-file
 treat absent first files as empty

 --ignore-file-name-case
 ignore case when comparing file names

 --no-ignore-file-name-case
 consider case when comparing file names

 -x, --exclude=PAT
 exclude files that match PAT

 -X, --exclude-from=FILE
 exclude files that match any pattern in FILE

 -S, --starting-file=FILE
 start with FILE when comparing directories

 --from-file=FILE1
 compare FILE1 to all operands; FILE1 can be a directory

 --to-file=FILE2
 compare all operands to FILE2; FILE2 can be a directory

 -i, --ignore-case
 ignore case differences in file contents

 -E, --ignore-tab-expansion
 ignore changes due to tab expansion

 -Z, --ignore-trailing-space
 ignore white space at line end

 -b, --ignore-space-change
 ignore changes in the amount of white space

 -w, --ignore-all-space
 ignore all white space

 -B, --ignore-blank-lines
 ignore changes whose lines are all blank

 -I, --ignore-matching-lines=RE
 ignore changes whose lines all match RE

 -a, --text
 treat all files as text

 --strip-trailing-cr
 strip trailing carriage return on input

 -D, --ifdef=NAME
 output merged file with `#ifdef NAME' diffs

 --GTYPE-group-format=GFMT
 format GTYPE input groups with GFMT

 --line-format=LFMT
 format all input lines with LFMT

 --LTYPE-line-format=LFMT
 format LTYPE input lines with LFMT

 These format options provide fine-grained control over the output

 of diff, generalizing -D/--ifdef.

 LTYPE is `old', `new', or `unchanged'.
 GTYPE is LTYPE or `changed'.

 GFMT (only) may contain:

 %< lines from FILE1

 %> lines from FILE2

 %= lines common to FILE1 and FILE2

 %[-][WIDTH][.[PREC]]{doxX}LETTER
 printf-style spec for LETTER

 LETTERs are as follows for new group, lower case for old group:

 F first line number

 L last line number

 N number of lines = L-F+1

 E F-1

 M L+1

 %(A=B?T:E)
 if A equals B then T else E

 LFMT (only) may contain:

 %L contents of line

 %l contents of line, excluding any trailing newline

 %[-][WIDTH][.[PREC]]{doxX}n
 printf-style spec for input line number

 Both GFMT and LFMT may contain:

 %% %

 %c'C' the single character C

 %c'\OOO'
 the character with octal code OOO

 C the character C (other characters represent themselves)

 -d, --minimal
 try hard to find a smaller set of changes

 --horizon-lines=NUM
 keep NUM lines of the common prefix and suffix

 --speed-large-files
 assume large files and many scattered small changes

 --help display this help and exit

 -v, --version
 output version information and exit

 

กลุ่มคำสั่ง

wdiff(1), comm(1), cmp(1), sdiff(1), patch(1)

 

Reference:

คำสั่ง Unix – Linux Command

Linux, Unix

 

Author: Suphakit Annoppornchai

Credit: https://saixiii.com

Leave a Reply