File: README.markdown

package info (click to toggle)
grc 1.13.1-1
  • links: PTS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 592 kB
  • sloc: python: 421; sh: 203; makefile: 34; sql: 31
file content (212 lines) | stat: -rw-r--r-- 9,808 bytes parent folder | download
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
# Generic Colouriser

Radovan GarabĂ­k  <http://kassiopeia.juls.savba.sk/~garabik/software/grc.html> (garabik @ kassiopeia.juls.savba.sk)

For the impatient - try following commands:

    grc netstat
    grc ping hostname
    grc tail /var/log/syslog
    grc ps aux

Being overflooded with different logfile colo(u)?ri(s|z)ers, colortails, gccolors, colormakes and similar programs for making text files or outputs of different programs more readable by inserting ansi colour control codes into them, I decided to write  my very own colouriser, eventually providing the functions of all those others.

Two programs are provided: `grc` and `grcat`.  The main is `grcat`, which acts as a filter, i.e. taking standard input, colourising it and writing to standard output.

## Configuration

`grcat` takes as a parameter the name of configuration file.

Directories `~/.grc/`, `/usr/local/share/grc/`, `/usr/share/grc/` are searched for the file (in this order). If the file is not found, it is assumed to be an absolute path of a configuration file located elsewhere.

Configuration file consists of entries, one per regexp, entries are separated with lines with first character non-alphanumeric (except #). Lines beginning with # or empty lines are ignored.

Each entry consists of several lines.

Each line has form: `keyword=value`

where keyword is one of: regexp, colours, command, concat, skip, replace, count

Only regexp is mandatory, but it does not have much sense by itself unless you specify at least a colour, skip, replace or command keyword as well.

**regexp** is the regular expression to match.

**colours** is the list of colours, separated by commas (you can specify only one colour), each colour per one regexp group specified in regexp.

if you use special colour name "previous", colour of the previous line of text will be used (actually, if both the first and last character of the previous line are of different colour than the default one, colour of the first one will be used).

Another special colour name "unchanged" will leave the colour unchanged, useful if you need some context for matching regular expression and you want to leave the colour of context unchanged.

Yet another special name is an arbitrary string enclosed in straight quotes. This string will be inserted directly into the output in front of the matching expression. The string will be eval'ed, so you can use usual python escape sequences.

This is useful on a 256-colour enabled xterm, where e.g.  `colours="\033[38;5;22m"` will give you a dark green (inspired by Rutger Ovidius). Caveat: the string cannot contain a comma. This is due to my laziness :-)

**command** is command to be executed when regexp matches. Its output will be mixed with normal stdout, use redirectors (`>/dev/null`) if you want to suppress it.

**concat** is the name of a file which the current line will be appended to when the regexp matches.

**skip** can be `skip=yes`, if that case the matched line is skipped (discarded from the output), or `skip=no`, when it is not skipped. Default (if you do not have skip keyword) is of course not skipped.

**replace** means the regular expression match will be replaced by the value. All the preceeding regular expressions will be evaluated against the original text, but if they match and the replacement changes the length of the text, the colouring will *stay at the same positions*, which is probably not what you want - therefore put the `replace` rule preferrably at the beginning of config file.

all the following regular expressions will be evaluated against the replaced text, not the original.

replacement is done by `re.sub()`, therefore you can use anything python supports - in particular, `\1`, `\2` etc... to include text from the original matching groups, e.g:

    regexp=(\d\d):(\d\d):(\d\d)
    replace=\1h\2m\3s

will change time format from 09:43:59 into 09h43m59s

**count** is one of words: once, more, stop, previous, block or unblock

- **once** means that if the regexp is matched, its first occurrence is coloured and the program will continue with other regexp's.
- **more** means that if there are multiple matches of the regexp in one line, all of them will be coloured.
- **stop** means that the regexp will be coloured and program will move to the next line (i.e. ignoring other regexp's)
- **previous** means the count will be the same as for the previous line
- **block** marks a start of a multiline block of text, coloured with the same colour
- **unblock**, obviously, marks the end of such a block

example:

    # this is probably a pathname
    regexp=/[\w/\.]+
    colour=green
    count=more

this will match `/usr/bin`, `/usr/local/bin/`, `/etc/init.d/syslogd` and similar strings and paint it with green.

Another example:

    regexp=^-{1,2}\s{0,1}$
    colours=red
    count=block
    -
    regexp=^\s{0,5}$
    colours=default
    count=unblock

this will turn all correctly formatted mail signatures red.

Regular expressions are evaluated from top to bottom, this allows nested and overlapped expressions. (e.g. you colour everything inside parentheses with one colour, and if a following expression matches the text inside parentheses, it will be also coloured).

# Typical usage:

    grcat conf.log < /var/log/syslog
    /usr/sbin/traceroute www.linux.org | grcat conf.traceroute
    grcat conf.esperanto < Fundamento.txt  | less -r

To facilitate the use, command `grc` acts as frontend for `grcat`, automatically choosing the configuration files, so you can write:

    grc netstat
    grc ping hostname
    grc tail /var/log/syslog

etc...

`grc` will execute command command with optional parameters piping its stdout into `grcat`.

Configuration file for `grcat` is determined by `/etc/grc.conf` or `~/.grc/grc.conf` file.

Format of `/etc/grc.conf` or `~/.grc/grc.conf:` each entry consists of 2 lines, between entries there can be any number of empty lines or lines beginning with # (comments).

First line is regular expression, second line the name of configuration file for `grcat`.

Configuration file after the first regular expression matching the rest of line after `grc` will be passed to grcat as its configuration file

For example, if you have

    # log file
    \b\w+\b.*log\b
    conf.log

    # traceroute command
    (^|[/\w\.]+/)traceroute\s
    conf.traceroute

in your `/etc/grc.conf`, then typing `grc cat /var/log/syslog` will use `conf.log` to colourise the output, `grc /usr/sbin/traceroute www.linux.org` will use `conf.traceroute`.

## Miscellaneous remarks:

You should get yourself familiar with regular expressions. Good reading is
at <http://docs.python.org/dev/howto/regex.html>

The program is not yet optimized for speed. There are places that can
give a big boost if optimized.

Regular expressions are handled by python, it means that they may be
slightly different from those you know from perl or grep. It's not my
fault in that case.

Colours are one of:

    none, default, bold, underline, blink, reverse, concealed,
    black, green, yellow, blue, magenta, cyan, white,
    on_black, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white
    beep

`on_red` means that the background (instead of foreground) is painted
with red etc...

Additional colours can be: `dark, italic, rapidblink, strikethrough`.
These are supported only on some terminals, so if you want to write
portable configuration files, avoid uing them (idea by James Rowe).

there can be more attributes per line (separated by space), e.g.

    # this is probably a pathname
    regexp=/[\w/\.]+
    colours=bold blink green
    count=more

will display pathnames in bold blinking green

## Python 2 & 3 compatibility

both grc and grcat are targetted towards python3 now; there is an attempt at python2 compatibility, meaning that both grc and grcat will run under both python2 and python3. However, all the regular expressions are strings, and grcat works on string input (not bytes).

## Hints

Following commands will display nice coloured log in virtual console 12:

If you have GNU tail:

    tail --follow=name /var/log/syslog | grcat conf.log >/dev/tty12

or, if you have recent BSD tail:

    tail -F /var/log/syslog | grcat conf.log >/dev/tty12

## Automatic aliases

You can start using grc automatically with supported commands. The following assumes that `grc.<sh|zsh|fish>` is in `/etc`. The location may differ (i. e. `/usr/local/etc` when installed with [homebrew](https://formulae.brew.sh/formula/grc)); or the `grc.sh` can be placed into `/etc/profile.d/` (this is in fact the default). Be aware this is somewhat invasive and better test it before deploying.

### Bash

To set aliases for supported commands, append to your `~/.bashrc`:

    GRC_ALIASES=true
    [[ -s "/etc/profile.d/grc.sh" ]] && source /etc/grc.sh

If the file `/etc/default/grc` exists, it is sourced first, therefore you can place a line saying `GRC_ALIASES=true` there.

### ZSH

Or for zsh users, append to `~/.zshrc`:

    [[ -s "/etc/grc.zsh" ]] && source /etc/grc.zsh

### Fish

Add to `~/.config/fish/config.fish` or in a new file in `~/.config/fish/conf.d/`:

    source /usr/local/etc/grc.fish

## Dynamic aliases

By running the follow code, it will check to see what programs are already installed on your OS (based on your `$PATH`), and echo out the result.  This could then be added to your shell resource file as a one off.  Alternatively, by removing the `echo` in the code, it could be placed into your shell resource file directly, and it will create the necessarily aliases each time:

    for cmd in g++ gas head make ld ping6 tail traceroute6 $( ls /usr/share/grc/ ); do
      cmd="${cmd##*conf.}"
      type "${cmd}" >/dev/null 2>&1 && echo alias "${cmd}"="$( which grc ) --colour=auto ${cmd}"
    done