การค้นหาตัวอักษรที่พิมพ์ไม่ได้ TLDR; บทสรุปผู้บริหาร
- ค้นหาตัวควบคุมและขยาย unicode
 
- การตั้งค่าโลแคลเช่น
LC_ALL=Cจำเป็นเพื่อให้ grep ทำในสิ่งที่คุณคาดหวังด้วย Unicode ที่ขยาย 
ดังนั้นผู้ค้นหาถ่านที่ไม่ใช่ ASCII ที่ต้องการ:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
เช่นเดียวกับในคำตอบด้านบน grep ผกผัน:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
ในคำตอบสูงสุด แต่ด้วยLC_ALL=C:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test
. . มากกว่า . . ระทมทุกข์รายละเอียดเกี่ยวกับเรื่องนี้:. . .
ฉันเห็นด้วยกับฮาร์วีย์ข้างต้นถูกฝังอยู่ในความคิดเห็นมักจะมีประโยชน์มากกว่าในการค้นหาอักขระที่ไม่สามารถพิมพ์ได้หรือเป็นเรื่องง่ายที่จะคิดว่าไม่ใช่ ASCII เมื่อคุณควรคิดถึงการพิมพ์ที่ไม่สามารถพิมพ์ได้ ฮาร์วีย์แนะนำ "ใช้สิ่งนี้:" [^\n -~]"เพิ่ม \ r สำหรับไฟล์ข้อความ DOS ซึ่งแปลเป็น"[^\x0A\x020-\x07E] "และเพิ่ม \ x0D สำหรับ CR"
นอกจากนี้การเพิ่ม -c (แสดงจำนวนรูปแบบที่ตรงกัน) ลงใน grep จะเป็นประโยชน์เมื่อค้นหา chars ที่ไม่สามารถพิมพ์ได้เนื่องจากสตริงที่จับคู่สามารถทำให้เทอร์มินัลหมด
ฉันพบการเพิ่มช่วง 0-8 และ 0x0e-0x1f (ในช่วง 0x80-0xff) เป็นรูปแบบที่มีประโยชน์ สิ่งนี้ไม่รวม TAB, CR และ LF และหนึ่งหรือสองตัวอักษรที่พิมพ์ผิดปกติได้ ดังนั้น IMHO รูปแบบ grep ที่ค่อนข้างมีประโยชน์ (แม้ว่าจะเป็นน้ำมันดิบ) ก็คืออันนี้:
grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
ตามจริงแล้วโดยทั่วไปคุณจะต้องทำสิ่งนี้:
LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *
ทำให้พังถล่ม:
LC_ALL=C - set locale to C, otherwise many extended chars will not match (even though they look like they are encoded > 0x80)
\x00-\x08 - non-printable control chars 0 - 7 decimal
\x0E-\x1F - more non-printable control chars 14 - 31 decimal
\x80-1xFF - non-printable chars > 128 decimal
-c - print count of matching lines instead of lines
-P - perl style regexps
Instead of -c you may prefer to use -n (and optionally -b) or -l
-n, --line-number
-b, --byte-offset
-l, --files-with-matches
เช่นตัวอย่างการใช้งานจริงพบเพื่อ grep ไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบัน:
LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} + 
คุณอาจต้องการที่จะปรับ grep ในบางครั้ง เช่น BS (0x08 - backspace) ถ่านที่ใช้ในไฟล์ที่พิมพ์ได้บางส่วนหรือเพื่อยกเว้น VT (0x0B - แท็บแนวตั้ง) ตัวอักษร BEL (0x07) และ ESC (0x1B) นั้นสามารถพิมพ์ได้ในบางกรณี
Non-Printable ASCII Chars
** marks PRINTABLE but CONTROL chars that is useful to exclude sometimes
Dec   Hex Ctrl Char description           Dec Hex Ctrl Char description
0     00  ^@  NULL                        16  10  ^P  DATA LINK ESCAPE (DLE)
1     01  ^A  START OF HEADING (SOH)      17  11  ^Q  DEVICE CONTROL 1 (DC1)
2     02  ^B  START OF TEXT (STX)         18  12  ^R  DEVICE CONTROL 2 (DC2)
3     03  ^C  END OF TEXT (ETX)           19  13  ^S  DEVICE CONTROL 3 (DC3)
4     04  ^D  END OF TRANSMISSION (EOT)   20  14  ^T  DEVICE CONTROL 4 (DC4)
5     05  ^E  END OF QUERY (ENQ)          21  15  ^U  NEGATIVE ACKNOWLEDGEMENT (NAK)
6     06  ^F  ACKNOWLEDGE (ACK)           22  16  ^V  SYNCHRONIZE (SYN)
7     07  ^G  BEEP (BEL)                  23  17  ^W  END OF TRANSMISSION BLOCK (ETB)
8     08  ^H  BACKSPACE (BS)**            24  18  ^X  CANCEL (CAN)
9     09  ^I  HORIZONTAL TAB (HT)**       25  19  ^Y  END OF MEDIUM (EM)
10    0A  ^J  LINE FEED (LF)**            26  1A  ^Z  SUBSTITUTE (SUB)
11    0B  ^K  VERTICAL TAB (VT)**         27  1B  ^[  ESCAPE (ESC)
12    0C  ^L  FF (FORM FEED)**            28  1C  ^\  FILE SEPARATOR (FS) RIGHT ARROW
13    0D  ^M  CR (CARRIAGE RETURN)**      29  1D  ^]  GROUP SEPARATOR (GS) LEFT ARROW
14    0E  ^N  SO (SHIFT OUT)              30  1E  ^^  RECORD SEPARATOR (RS) UP ARROW
15    0F  ^O  SI (SHIFT IN)               31  1F  ^_  UNIT SEPARATOR (US) DOWN ARROW
UPDATE:ฉันต้องกลับมาทบทวนเรื่องนี้เมื่อเร็ว ๆ นี้ และ YYMV ขึ้นอยู่กับการตั้งค่าเทอร์มินัล / พยากรณ์อากาศแสงอาทิตย์ แต่ . ฉันสังเกตเห็นว่าgrep ไม่พบยูนิโค้ดหรือตัวละครมากมาย แม้ว่าพวกเขาควรจับคู่ช่วง 0x80 ถึง 0xff, 3 และ 4 ไบต์อักขระ unicode ไม่ตรงกัน ??? มีใครอธิบายเรื่องนี้ได้บ้าง ใช่. @frabjous ถามแล้ว @calandoa อธิบายว่าLC_ALL=Cควรใช้เพื่อตั้งค่าภาษาสำหรับคำสั่งเพื่อทำการจับคู่ grep  
เช่นสถานที่ของฉันLC_ALL=ว่างเปล่า
$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=
grep ที่มีค่าLC_ALL=ว่างตรงกับตัวอักษรเข้ารหัส 2 ไบต์ แต่ไม่เข้ารหัส 3 และ 4 ไบต์:
$ grep -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" notes_unicode_emoji_test
5:© copyright c2a9
7:call  underscore c2a0
9:CTRL
31:5 © copyright
32:7 call  underscore
grep with LC_ALL=Cดูเหมือนจะไม่ตรงกับอักขระส่วนขยายทั้งหมดที่คุณต้องการ:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test  
1:���� unicode dashes e28090
3:��� Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5:� copyright c2a9
7:call� underscore c2a0
11:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29:1 ���� unicode dashes
30:3 ��� Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31:5 � copyright
32:7 call� underscore
33:11 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other
34:52 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other
81:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other
การจับคู่ Perl นี้ (พบบางส่วนที่อื่นใน stackoverflow) หรือ grep ผกผันของคำตอบด้านบนดูเหมือนจะพบอักขระ ~ แปลกและ ~ วิเศษ ~ ~ ไม่ใช่ ASCII ทั้งหมดโดยไม่ต้องตั้งค่าภาษา:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test  
1 ‐‐ unicode dashes e28090
3 💘 Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5 © copyright c2a9
7 call  underscore c2a0
9 CTRL-H CHARS URK URK URK 
11 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ  YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29 1 ‐‐ unicode dashes
30 3 💘 Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31 5 © copyright
32 7 call  underscore
33 11 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ  YEOW, mix of japanese and chars from other
34 52 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ  YEOW, mix of japanese and chars from other
73 LIVE‐E! あいうえお かが アイウエオ カガ ᚊ ᚋ ซฌ आइ  YEOW, mix of japanese and chars from other
ดังนั้นผู้ค้นหาถ่านที่ไม่ใช่ ASCII ที่ต้องการ:
$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test
เช่นเดียวกับในคำตอบด้านบน grep ผกผัน:
$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test
ในคำตอบสูงสุด แต่ด้วยLC_ALL=C:
$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test