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:
Author: Suphakit Annoppornchai
Credit: https://saixiii.com