scols-filter - Man Page

syntax for libsmartcols filter expressions


expr: param
      | ( expr )
      | expr && expr | expr AND expr
      | expr || expr | expr OR expr
      | !expr        | NOT expr
      | expr == expr | expr EQ expr
      | expr != expr | expr NE expr
      | expr >= expr | expr GE expr
      | expr <= expr | expr LE expr
      | expr >  expr | expr GT expr
      | expr <  expr | expr LT expr
      | expr =~ string
      | expr !~ string

param: integer
      | float
      | string
      | boolean
      | holder

integer: [0-9]*

float: integer.integer

boolean: "true" | "false" | "TRUE" | "FALSE"

string: "[^\n\"]*" | '[^\n\']*'

holder: [a-zA-Z][a-zA-Z_.%:/\-0-9]*


The filter expression can be used by application linked with libsmartcols to filter output data. The application can use the filter before it gathers all data for the output to reduce resources and improve performance. This makes scols filter more effective than grep(1) on the complete output. For example

 lsblk --output NAME,LABEL,FSTYPE --filter 'NAME=="sda1"'

helps lsblk(1) to not read LABELs for all block device from udevd or libblkid, but read it only for device sda1.

The filter can be also used for columns which are not used in the output.

Syntax Notes

An expression consists of holders, params, and operators.

The currently supported holder type is column name only. The name has to be used without quotes. Before evaluation, application map column names in the given expression to the output table columns and assign column data type to the holder. The default type is "string".

The param is for representing a value directly. The currenly supported data types are integer, float, string and boolean.

An operator works with one or two operand(s). An operator has an expectation about the data type(s) of its operands. Giving an unexpected data type to an operator causes a syntax error. The library can cast between data types, the prefferred is always the type as specified by param and in case of expression with number and float the preferred is the float.

Operators taking two operands are and, or, eq, ne, le, lt, ge, gt, =~, !~. Alphabetically named operators have C-language flavored aliases: &&, ||, ==, !=, <, ā‡, >=, and >.

! is the only operator that takes one operand. If no operator is specified then expression is true if param or holder are not empty. For example --filter NAME will return lines where column NAME is not empty.

=~ and !~ is for regular expression matching; if a string at the right side matches (or not matches for !~ a regular expression at the left side, the result is true. The right side operand must be a string literal.

The precedences within operators is or, and, and eq, ne, le, gt, ge, =~, !~, not.


About float and integer typed values, the filter engine supports only non-negative numbers. The integer is unsigned 64-bit number, and float is long double.


Karel Zak

Based on original implementation from Masatake YAMATO.

Reporting Bugs

For bug reports, use the issue tracker at


The libsmartcols library is part of the util-linux package since version 2.25. It can be downloaded from Linux Kernel Archive.

Referenced By

lsblk(8), lsfd(1).

2024-03-20 util-linux 2.40 File formats and conventions