blob: 14e55465cdafdea6a93e65a6d7b3f32da070c138 (
plain) (
blame)
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
|
# Grab — A better grep
Grab is a more powerful version of the well-known Grep utility, making
use of structural regular expressions as described by Rob Pike in [this
paper][1]. Grab allows you to be far more precise with your searching
than Grep, as it doesn’t constrain itself to working only on individual
lines.
Grab invokations must include a pattern string which specifies which text
to match. A pattern string consists of one or more commands. A command
is an operator followed by a delimiter, a regular expression (regex), and
then terminated by the same delimiter. The last delimiter of the last
command is optional.
For example, a pattern string may look like ‘`x/[a-z]+/ g.foo. v/bar/`’.
The available operators are ‘g’, ‘v’, and ‘x’. The ‘x' operator iterates
over all matches of the corresponding regex. This means that to print
all numbers in a file, you can use the pattern string ‘`x/[0-9]+/`’. The
‘g’ and ‘v’ operators are filters. The ‘g’ operator discards all results
that don’t match the given regex, while the ‘v’ operator discards all
results that *do* match the given regex. This means that to select all
numbers in a file that contain a ‘3’ but are not ‘1337’, you can use the
pattern string ‘`x/[0-9]+/ g/3/ v/^1337$/`’.
## Examples
Get a list of your CPU flags.
```sh
# With Grep
grep '^flags' /proc/cpuinfo \
| sed 's/flags:\t*: //; y/ /\n/' \
| sort \
| uniq
# With Grab
grab 'x/^flags.*/ x/\w+/ v/flags/' /proc/cpuinfo \
| sort \
| uniq
```
1) Select lines that start with ‘flags’: `x/^flags.*/`
2) Select all the words: `x/\w+/`
3) Filter out the word ‘flags’: `v/flags/`
## Additional Options
The Grab utility has a few options that may be helpful for your usecase.
For more detailed documentation, see the Grab manual with `man grab`.
[1]: https://doc.cat-v.org/bell_labs/structural_regexps/se.pdf
|