1
1
mirror of https://github.com/gelisam/hawk.git synced 2024-11-30 21:37:35 +03:00
Haskell text processor for the command-line
Go to file
Jens Petersen bc894ae93c cabal-doctest < 1.0.4 is too old
/home/runner/work/hawk/hawk/tests/RunTests.hs:30:15: error:
Error:     Not in scope: ‘CabalDoctest.flags_exe_hawk’
2021-05-08 11:28:36 +08:00
.github/workflows reintroduce the happy hack 2021-05-07 23:04:31 -04:00
doc clarify first run sentence 2016-07-15 11:23:18 -04:00
runtime/System/Console/Hawk only use Paths_haskell_awk from the library 2021-01-01 16:33:05 -05:00
src don't import MonadFail in ghc versions which don't have it 2021-05-07 22:45:00 -04:00
tests also run the executable's doctests 2021-01-01 15:06:20 -05:00
.gitignore switch to hpack 2018-03-17 17:44:53 -04:00
bump-lower-bounds.vim bump oldest supported lts 2021-01-01 15:41:44 -05:00
CHANGELOG.md prepare 1.2.0.1 2021-05-08 11:11:52 +08:00
CONTRIBUTING.md github prefers "good first issue" to "easy" 2020-06-16 11:04:33 -04:00
haskell-awk.cabal cabal-doctest < 1.0.4 is too old 2021-05-08 11:28:36 +08:00
LICENSE change to Apache v2 license 2013-09-04 21:54:04 +02:00
NOTICE change to Apache v2 license 2013-09-04 21:54:04 +02:00
oldest-supported-lts.yaml cabal-doctest < 1.0.4 is too old 2021-05-08 11:28:36 +08:00
package.yaml cabal-doctest < 1.0.4 is too old 2021-05-08 11:28:36 +08:00
README.md build status badge 2020-12-29 12:33:59 -05:00
Setup.hs switch to cabal-doctest 2021-01-01 14:45:39 -05:00
stack.yaml requires base-4.13 (ghc-8.8) for MonadFail.fail to work correctly 2021-03-13 16:19:43 +08:00

Hawk Hackage Build Status

Transform text from the command-line using Haskell expressions. Similar to awk, but using Haskell as the text-processing language.

Examples

In Unix the file /etc/passwd is used to keep track of every registered user in the system. Each entry in the file contains information about a single user, using a simple colon-separated format. For example:

root:x:0:0:root:/root:/bin/bash

The first field is the username. We can use Hawk to list all usernames as follows:

> cat /etc/passwd | hawk -d: -m 'head'
root

The -d option tells Hawk to use : as field delimiters, causing the first line to be interpreted as ["root", "x", "0", "0", "root", "/root", "/bin/bash"]. The -m tells Hawk to map a function over each line of the input. In this case, the function head extracts the first field of the line, which happens to be the username.

We could of course have achieved identical results by using awk instead of Hawk:

> cat /etc/passwd | awk -F: '{print $1}'
root

While Hawk and awk have similar use cases, the philosophy behind the two is very different. Awk uses a specialized language designed to concisely express many text transformations, while Hawk uses the general-purpose language Haskell, which is also known for being concise, among other things. There are many standard command-line tools that can be easily approximated using short Haskell expressions.

Another important difference is that while awk one-liners are self-contained, Hawk encourages the use of libraries and user-defined functions. By adding function definitions, module imports and language pragmas to Hawk's user-configurable prelude file, those functions, libraries and language extensions become available to Hawk one-liners. For instance, we could add a takeLast function extracting the last n elements from a list, and use it to (inefficiently) approximate tail:

> echo 'takeLast n = reverse . take n . reverse' >> ~/.hawk/prelude.hs
> seq 0 100 | hawk -a 'takeLast 3'
98
99
100

For more details, see the presentation and the documentation.

Installation

To install hawk, clone this repository, run stack install, and add ~/.local/bin to your PATH. Alternatively, you can also use cabal, but only v1-style is currently supported: run cabal v1-sandbox init && cabal v1-install, and add /.../.cabal-sandbox/bin to your PATH.

You should be ready to use Hawk:

> hawk '[1..3]'
1
2
3

The first run will create a default configuration file into ~/.hawk/prelude.hs if it doesn't exist.