경기 전후에 5줄을 grep하려고 합니다. AIX를 사용하고 있으므로 다음과 같은 GNU 기능이 없습니다.
grep -B 5 -A 5 pattern file
grep, awk, perl, sed 또는 다른 것을 사용하여 이를 수행할 수 있는 방법이 있습니까? 라이너를 구입할 수 있나요? 여러 서버에서 이 작업을 수행하려고 합니다.
더 많은 정보를 추가하세요:
$ cat b.txt
100
101
102
103
104
Successful
105
106
107
108
109
110
111
112
113
114
115
116
Successful
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Successful
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
Successful
154
155
156
157
$ grep -B 5 -A 5 Successful b.txt
100
101
102
103
104
Successful
105
106
107
108
109
--
112
113
114
115
116
Successful
117
118
119
120
121
--
129
130
131
132
133
Successful
134
135
136
137
138
--
149
150
151
152
153
Successful
154
155
156
157
$
답변1
모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ seq 20 | awk -v b=5 -v a=5 '/10/{for (i=(NR-b > 0 ? NR-b : 1); i<NR; i++) print buf[i%b]; c=a+1} {buf[NR%b]=$0} c&&c--'
5
6
7
8
9
10
11
12
13
14
15
~처럼@콰지모도grep
주석에서 지적했듯이 위의 동작은 겹치는 범위와 정확히 동일하지 않습니다.
$ seq 20 | grep -B 5 -A 5 -E '^[57]'
1
2
3
4
5
6
7
8
9
10
11
12
대안은 다음과 같습니다.
$ seq 20 | awk -v b=5 -v a=5 '/^[57]/{for (i=NR-b; i<NR; i++) { j=i%b; if (j in buf) print buf[j]; delete buf[j] } c=a+1} { if ( c&&c-- ) print; else buf[NR%b]=$0 }'
1
2
3
4
5
6
7
8
9
10
11
12