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}$

 

posted @ 2015-03-31 20:24  琴水玉  阅读(2623)  评论(0编辑  收藏  举报