Searching for keywords and patterns in tasks is straightforward, and uses the /pattern/ syntax. First we create some sample tasks, then we’ll search them.

$ task add foo
$ task add bar
$ task add baz

In order to locate that first task, by the keyword foo we do this:

$ task /foo/ list

ID Age   D Description Urg
-- ----- - ----------- ----
 1 1min    foo            0

The / characters delimit the search term, indicating what Taskwarrior should do. Because task annotations are also searchable text, we can be sure that any annotations containing the pattern /foo/ will also be found. Let’s add a task with such an annotation:

$ task 3 annotate footwear
$ task /foo/ long

ID Created    Mod   Recur Description
-- ---------- ----- ----- ---------------------
 3 2014-09-28 2min        baz
                            2014-09-28 footwear
 1 2014-09-28 2min       foo

Here the long report is used, so we can see the full annotation text. Notice that the foo in the description of task 1, as well as the footwear in the annotation of task 3 were both found.

Regular Expressions

Beginning in version 2.4.0 all search terms are by default regular expressions. This means we could have searched using this pattern, which means an f followed by two o characters:

$ task /fo{2}/ long

ID Created    Mod   Recur Description
-- ---------- ----- ----- ---------------------
 3 2014-09-28 3min        baz
                            2014-09-28 footwear
 1 2014-09-28 3min       foo

In older versions, you would need to explicitly enable regex support like this:

$ task rc.regex:on /fo{2}/ long

ID Created    Mod   Recur Description
-- ---------- ----- ----- ---------------------
 3 2014-09-28 3min        baz
                            2014-09-28 footwear
 1 2014-09-28 3min       foo

Or you could put the setting in your .taskrc file. You can also turn off regular expression support:

$ task rc.regex:off /fo{2}/ long

No matches.

This fails because the search term /fo{2}/ is this time considered just text, not a regular expression and this term does not appear in any task.


If your search term contains one or more spaces, then your shell is going to break the search pattern into two arguments, and Taskwarrior will be confused. Solve this by either quoting or escaping like these examples:

$ task '/foo bar/' list
$ task /foo\ bar/ list

This guarantees that Taskwarrior sees one argument, /foo bar/ instead of two, /foo, bar/.


The search pattern syntax of /pattern/ is there as a convenience, but there are more powerful low-level operators, such that the above pattern is equivalent to:

$ task description~foo list

Here the ~ match operator works much like that in Bash. To invert that, to search for descriptions that do not contain the pattern, use the no-match operator:

$ task 'desc!~foo' list

Here you see the !~ no-match operator, an abbreviated desc attribute name, and quoting, because Bash will interpret the ! character in its own way.