Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 03
Post

Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 03

Grep, wyrażenia regularne, potoki i inne narzędzia do pracy na plikach

Poznaliśmy już podstawy pracy na plikach oraz znaki specjalne. Dziś zajmiemy się zawartością plików.

Grep czy egrep?

Polecenie grep (skrót od global regular expression print) wyświetla na konsoli linie z pliku, które pasują do podanego wyrażenia regularnego.

Składnia:

1
grep [opcje] [wyrażenie] [plik]

Wyrażenie regularne to zapis opisujący określony ciąg symboli. W poprzednich zajęciach poznaliśmy podstawowe wzorce (tzw. wildcardy). Dziś zajmiemy się bardziej zaawansowanymi wyrażeniami regularnymi.

Polecenie egrep (extended grep) to rozszerzona wersja grep, obsługująca zaawansowane wyrażenia regularne. Ten sam efekt uzyskamy, używając opcji -E w poleceniu grep:

1
grep -E

Wyrażenia regularne

Wyrażenia regularne działają na podobnej zasadzie jak wcześniej poznane symbole wieloznaczne, ale są bardziej złożone i oferują większe możliwości. Poniżej przedstawiono podstawowe elementy wyrażeń regularnych:

  • . – dowolny pojedynczy znak
  • ? – poprzedni znak występuje 0 lub 1 raz
  • * – poprzedni znak występuje 0 lub więcej razy
  • + – poprzedni znak występuje 1 lub więcej razy
  • {n} – poprzedni znak występuje dokładnie n razy
  • {n,m} – poprzedni znak występuje od n do m razy
  • [abc] – dowolny znak z podanych w nawiasie
  • [^abc] – dowolny znak, który nie jest jednym z podanych w nawiasie
  • () – grupowanie znaków lub wyrażeń
  • | – alternatywa (operacja logiczna OR)
  • ^ – początek linii
  • $ – koniec linii (przyjmujemy tu znacznik LF; w przypadku Windowsowego CRLF może nie zostać wykryty)

Przykłady zastosowania

Otwórz plik lista_zakupów.txt. Zaczniemy od prostego polecenia:

1
egrep 'Lidl' lista_zakupów.txt

Polecenie to wypisze wszystkie pozycje zakupów, które mamy zrobić w Lidlu. Jednak niektóre wpisy mogą być zapisane od małej litery. Aby uwzględnić zarówno “Lidl”, jak i “lidl”, możemy użyć nawiasów kwadratowych:

1
egrep '[lL]idl' lista_zakupów.txt

Wyszukiwanie konkretnych ilości

Teraz wyszukamy produkty, które chcemy kupić w ilości dwóch sztuk. Jeśli użyjemy polecenia:

1
egrep '2' lista_zakupów.txt

otrzymamy wszystkie pozycje zawierające cyfrę “2”, co nie jest naszym celem. Możemy spróbować dodać znak końca linii po “2”:

1
egrep '2$' lista_zakupów.txt

Jednak to nadal zwróci również pozycje, w których ilość to “12”, ponieważ kończą się na “2”. W tym przypadku pomocne będą skróty oznaczające klasy znaków:

  • \w – znaki słowne, czyli [A-Za-z0-9_]
  • \s – znaki białe, np. spacje, tabulatory
  • \d – cyfry od 0 do 9 (uwaga: grep od wersji 3.4 nie wspiera tego skrótu; zamiast tego używamy [0-9] lub [[:digit:]])

Aby wypisać wszystkie pozycje, które chcemy zakupić w ilości dokładnie 2 sztuk, użyjemy polecenia:

1
egrep '\s2$' lista_zakupów.txt

Wyszukiwanie produktów z konkretnych sklepów

Aby w pliku lista_zakupów.txt znaleźć wszystkie produkty, które zamierzamy kupić w Lidlu lub Auchan w ilości 2 sztuk, użyjemy polecenia:

1
egrep '([lL]idl|Auchan)\s\w*\s2$' lista_zakupów.txt

Potoki i przekierowania

Przypomnijmy podstawy dotyczące potoków i przekierowań. Co się stanie, gdy zastosujemy polecenie ls? Na konsoli zostanie wyświetlona lista plików i katalogów. Inne polecenie, które poznaliśmy wcześniej, to:

1
history > history.txt

To polecenie zapisuje całą historię poleceń do pliku history.txt. Między poleceniem history a nazwą pliku znajduje się znak przekierowania >, który przekazuje wynik działania polecenia po lewej stronie do pliku podanego po prawej stronie. W ten sposób, aby zapisać wynik polecenia ls do pliku, użyjemy:

1
ls > lista.txt

Na tej samej zasadzie możemy zapisać wynik działania polecenia grep do pliku.

Zasada działania

Każdy program (polecenie) ma trzy standardowe strumienie danych. Przetwarza dane wejściowe (STDIN) i generuje dane wyjściowe (STDOUT), które domyślnie są wyświetlane w terminalu. Dodatkowo może generować komunikaty błędów (STDERR). Potoki i przekierowania umożliwiają przekierowanie tych strumieni w inne miejsca.

  • > – przekierowuje wyjście (STDOUT) do pliku (nadpisuje zawartość)
  • >> – przekierowuje wyjście do pliku (dopisywanie na końcu pliku)
  • | – przekierowuje wyjście do innego programu (tworzy potok)
  • < – przekierowuje zawartość pliku na wejście programu (STDIN)
  • 2> – przekierowuje strumień błędów (STDERR) do pliku

Przykład zastosowania

Dla przykładu, zapiszemy do pliku zabka.txt ponumerowaną listę zakupów z Żabki. W tym celu najpierw użyjemy polecenia grep, a następnie wynik jego działania przekażemy do polecenia nl (numerowanie linii), po czym zapiszemy dane wyjściowe do pliku:

1
egrep 'Żabka' lista_zakupow.txt | nl > zabka.txt

Zadanie

Z pliku komputery.txt znajdź wszystkie komputery z pierwszych 100 oraz ostatnich 150 linii (mogą przydać się polecenia z poprzednich zajęć), o oznaczeniu sekcji R, N lub Z. Ponumeruj je i zapisz do pliku PC.txt.


@Skrypt przygotowany na bazie pracy mgr inż. Michała Hyli. http://mhyla.com

Załącznik do laboratorium

Do wykonania zadań utworz plik komputery.txt i uzupełnij go ponizszymi danymi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
Numer_komputera	Sekcja	
1	R	700
2	N	130
3	E	300
4	B	120
5	F	200
6	B	500
7	M	800
8	A	300
9	F	340
10	W	260
11	M	500
12	V	300
13	G	390
14	F	200
15	F	800
16	G	400
17	K	300
18	K	300
19	H	300
20	Q	300
21	Y	300
22	F	300
23	J	300
24	U	300
25	Y	300
26	T	700
27	T	300
28	E	700
29	A	400
30	J	200
31	J	500
32	W	500
33	I	290
34	H	270
35	T	300
36	A	300
37	G	400
38	A	200
39	C	250
40	S	160
41	W	160
42	A	600
43	J	300
44	Z	700
45	O	300
46	N	300
47	Y	340
48	F	400
49	C	300
50	F	350
51	O	300
52	O	800
53	Z	800
54	N	390
55	G	290
56	G	800
57	I	200
58	T	500
59	X	700
60	H	300
61	R	500
62	B	300
63	Z	300
64	K	300
65	A	500
66	N	400
67	W	400
68	L	320
69	T	300
70	A	150
71	U	300
72	N	300
73	H	300
74	A	370
75	O	130
76	R	300
77	H	700
78	Q	400
79	I	300
80	R	600
81	R	310
82	E	500
83	B	350
84	S	370
85	R	220
86	E	800
87	Q	300
88	E	130
89	Q	160
90	K	300
91	K	300
92	A	300
93	G	140
94	D	100
95	M	320
96	H	800
97	N	600
98	B	300
99	C	370
100	Y	300
101	Y	300
102	Y	240
103	Z	600
104	J	300
105	C	360
106	G	300
107	H	200
108	U	320
109	B	700
110	W	300
111	U	290
112	J	200
113	C	300
114	R	400
115	G	600
116	X	800
117	N	300
118	G	140
119	O	270
120	Y	700
121	C	280
122	O	220
123	A	200
124	G	300
125	E	300
126	E	110
127	O	130
128	E	300
129	U	200
130	W	300
131	E	160
132	N	300
133	O	300
134	U	100
135	F	800
136	E	240
137	D	500
138	C	160
139	J	800
140	F	300
141	I	110
142	S	170
143	V	220
144	N	800
145	C	600
146	H	300
147	Z	400
148	O	160
149	U	600
150	O	100
151	K	100
152	N	400
153	T	280
154	N	800
155	G	330
156	L	500
157	A	260
158	Y	300
159	Y	220
160	O	300
161	L	300
162	I	700
163	S	400
164	A	800
165	K	300
166	J	500
167	Y	300
168	N	230
169	P	300
170	O	300
171	A	300
172	K	350
173	C	300
174	L	300
175	M	500
176	L	300
177	S	300
178	M	200
179	E	210
180	Z	300
181	Y	300
182	P	500
183	D	800
184	R	300
185	O	800
186	Q	250
187	V	170
188	R	500
189	E	310
190	H	290
191	D	500
192	X	300
193	A	270
194	F	300
195	T	300
196	F	280
197	D	600
198	Z	700
199	J	800
200	C	600
201	T	400
202	A	300
203	P	200
204	T	200
205	C	300
206	N	250
207	H	700
208	C	300
209	V	800
210	B	280
211	E	360
212	J	300
213	N	400
214	D	300
215	F	300
216	O	600
217	W	500
218	D	240
219	Y	300
220	P	300
221	S	400
222	B	800
223	N	200
224	U	300
225	P	170
226	W	200
227	M	800
228	S	400
229	O	300
230	T	340
231	G	200
232	E	160
233	Y	300
234	K	300
235	Z	200
236	X	400
237	M	300
238	C	500
239	S	310
240	H	300
241	W	300
242	H	230
243	W	500
244	O	800
245	I	300
246	G	300
247	O	700
248	U	300
249	V	200
250	P	700
251	C	400
252	W	250
253	W	300
254	J	600
255	X	320
256	J	700
257	M	320
258	Z	230
259	Q	800
260	Z	700
261	O	160
262	O	300
263	M	600
264	V	200
265	I	200
266	P	350
267	E	300
268	M	280
269	F	600
270	B	250
271	P	300
272	D	600
273	J	300
274	K	300
275	Z	140
276	X	300
277	V	500
278	V	300
279	R	500
280	W	300
281	H	300
282	R	370
283	T	200
284	H	350
285	B	300
286	J	200
287	K	350
288	R	600
289	F	110
290	I	200
291	F	100
292	F	800
293	C	300
294	U	700
295	Y	300
296	S	370
297	K	700
298	C	290
299	O	600
300	U	300
301	U	300
302	L	700
303	Y	200
304	M	140
305	L	300
306	L	300
307	V	300
308	V	200
309	H	300
310	H	140
311	Y	300
312	M	300
313	J	500
314	Y	500
315	E	300
316	R	300
317	J	500
318	E	600
319	G	500
320	M	300
321	I	230
322	J	350
323	Q	210
324	A	230
325	C	160
326	S	300
327	W	220
328	T	700
329	K	700
330	L	300
331	E	290
332	W	160
333	S	300
334	T	150
335	T	300
336	F	300
337	Y	300
338	R	300
339	Y	300
340	I	120
341	J	300
342	A	300
343	N	300
344	T	120
345	M	300
346	V	260
347	F	300
348	K	150
349	S	240
350	O	300
351	U	390
352	E	250
353	S	380
354	Q	270
355	I	600
356	O	290
357	Y	300
358	P	500
359	G	500
360	F	300
361	V	600
362	M	600
363	U	330
364	J	300
365	Z	800
366	P	340
367	I	290
368	Z	800
369	T	300
370	S	290
371	H	240
372	V	700
373	U	300
374	S	260
375	W	150
376	E	300
377	Q	300
378	Q	220
379	Z	300
380	I	300
381	E	600
382	Z	330
383	N	700
384	F	700
385	G	800
386	T	400
387	Y	300
388	M	330
389	D	600
390	L	300
391	B	300
392	H	200
393	U	300
394	J	600
395	P	800
396	F	300
397	V	300
398	S	230
399	Y	310
400	N	400
401	T	600
402	F	300
403	U	300
404	V	800
405	T	290
406	T	250
407	E	260
408	B	600
409	R	100
410	E	290
411	H	400
412	M	370
413	X	280
414	Y	300
415	Y	300
416	Y	210
417	T	300
418	C	700
419	A	600
420	N	190
421	H	200
422	E	260
423	I	390
424	G	390
425	C	370
426	I	390
427	I	300
428	X	200
429	W	300
430	Q	190
431	M	700
432	I	300
433	P	800
434	B	250
435	P	110
436	D	300
437	F	800
438	P	300
439	R	300
440	G	300
441	D	100
442	E	300
443	Q	100
444	U	500
445	E	700
446	R	110
447	H	200
448	B	300
449	F	300
450	E	300
451	T	300
452	R	210
453	F	220
454	I	230
455	S	240
456	Y	260
457	B	300
458	Q	300
459	Q	210
460	H	350
461	E	120
462	H	240
463	V	190
464	N	220
465	N	300
466	D	220
467	S	500
468	U	700
469	H	390
470	Z	500
471	A	300
472	K	200
473	J	500
474	H	260
475	M	150
476	A	220
477	K	370
478	S	300
479	Z	300
480	B	270
481	O	500
482	X	700
483	X	300
484	D	300
485	I	250
486	T	300
487	X	300
488	P	310
489	Y	300
490	C	200
491	H	300
492	J	200
493	G	380
494	C	300
495	F	210
496	V	300
497	I	240
498	Z	300
499	D	300
500	L	300