Awk使用一例:获取ASCII可见字符
要做一个需求, 支持可见特殊字符的密码设置。 首先, 需要获取到所有可见特殊字符。 到网上搜索到 ASCII 字符表格, 并复制到文本文件 vschars.txt:
00 00 0 nul 100 40 64 @ 01 01 1 soh 101 41 65 A 02 02 2 stx 102 42 66 B 03 03 3 etx 103 43 67 C 04 04 4 eot 104 44 68 D 05 05 5 enq 105 45 69 E 06 06 6 ack 106 46 70 F 07 07 7 bel 107 47 71 G 10 08 8 bs 110 48 72 H 11 09 9 ht 111 49 73 I 12 0a 10 nl 112 4a 74 J 13 0b 11 vt 113 4b 75 K 14 0c 12 ff 114 4c 76 L 15 0d 13 er 115 4d 77 M 16 0e 14 so 116 4e 78 N 17 0f 15 si 117 4f 79 O 20 10 16 dle 120 50 80 P 21 11 17 dc1 121 51 81 Q 22 12 18 dc2 122 52 82 R 23 13 19 dc3 123 53 83 S 24 14 20 dc4 124 54 84 T 25 15 21 nak 125 55 85 U 26 16 22 syn 126 56 86 V 27 17 23 etb 127 57 87 W 30 18 24 can 130 58 88 X 31 19 25 em 131 59 89 Y 32 1a 26 sub 132 5a 90 Z 33 1b 27 esc 133 5b 91 [ 34 1c 28 fs 134 5c 92 \ 35 1d 29 gs 135 5d 93 ] 36 1e 30 re 136 5e 94 ^ 37 1f 31 us 137 5f 95 _ 40 20 32 sp 140 60 96 ' 41 21 33 ! 141 61 97 a 42 22 34 " 142 62 98 b 43 23 35 # 143 63 99 c 44 24 36 $ 144 64 100 d 45 25 37 % 145 65 101 e 46 26 38 & 146 66 102 f 47 27 39 ` 147 67 103 g 50 28 40 ( 150 68 104 h 51 29 41 ) 151 69 105 i 52 2a 42 * 152 6a 106 j 53 2b 43 + 153 6b 107 k 54 2c 44 , 154 6c 108 l 55 2d 45 - 155 6d 109 m 56 2e 46 . 156 6e 110 n 57 2f 47 / 157 6f 111 o 60 30 48 0 160 70 112 p 61 31 49 1 161 71 113 q 62 32 50 2 162 72 114 r 63 33 51 3 163 73 115 s 64 34 52 4 164 74 116 t 65 35 53 5 165 75 117 u 66 36 54 6 166 76 118 v 67 37 55 7 167 77 119 w 70 38 56 8 170 78 120 x 71 39 57 9 171 79 121 y 72 3a 58 : 172 7a 122 z 73 3b 59 ; 173 7b 123 { 74 3c 60 < 174 7c 124 | 75 3d 61 = 175 7d 125 } 76 3e 62 > 176 7e 126 ~ 77 3f 63 ? 177 7f 127 del
现在, 需要从该文本文件中抽取出所有可见特殊字符, 当然, 也包括常见的大小写字母及数字。 使用如下命令即可:
$ awk 'BEGIN{OFS="\n"}{print $4, $8}' vschars.txt | sort | awk 'BEGIN{ORS=""}{if(length($0) ==1){print $0}}' '-!"#$%&()*,./:;?@[\]^_`{|}~+<=>0123456789aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
解释一下:
1. 首先要输出需要的字符。awk 使用 $4, $8 可以获取所需列,默认空白符分割, 输出分割符 OFS 选择换行, 保证每行一个;
2. 接着做一个排序, 使得字母、数字、特殊字符分开显示;
3. 发现可见字符是一个字符, 可以使用记录长度进行过滤: if(length($0) ==1){print $0}。 记录分隔符 ORS 选择空字符串,保证所有可见字符紧挨着显示。便于直接写正则表达式。
支持ASCII可见字符(包含空格)的正则表达式为: ^[a-zA-z0-9'!\"#$%&()*,./:;?@^_`\\[\\]{|}~+<=>\\ -]{m,n}$