aix grep は [重複] 前後の行と一致します。

aix grep は [重複] 前後の行と一致します。

試合前後に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

おすすめ記事