> ## Content Index
> Fetch the complete content index at: https://www.workroom-productions.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# Exercise: Redirection Operators
- URL: https://www.workroom-productions.com/exercise-redirection-operators/
- Published: 2025-10-01T19:36:39.000Z
- Updated: 2025-10-02T13:58:23.000Z
- Description: Testing-related exercises for `|`, `>`, `<`, `>>` and more.
- Author: James Lyndsay
- Tags: Exercises

A set of testing-relevant exercises to help testers use, and see the use of, redirection operators on the commandline. 

To move information between commandline commands, use `|` to link inputs to outputs. Use `<` to take the input from a file, then use `>` and `>>` to put the output into a file. More info at [Redirection Operators for Testers](https://www.workroom-productions.com/redirection-operators-for-testers/).

Use environments at <https://redir.workroomprds.com>

Password is `password`, please choose a name to go to a home page, from there pick code server, and you should be in vscode.

From there, open your home folder as a file browser, and open the terminal, and get the files needed with `git clone `<https://github.com/workroomprds/for-redirection-operators.git>

## Exercise 1 – count the unique values in a table

We'll use `items.csv`

Use `cut -d',' -f4 items.csv` to see all the country codes. 

Use `cut -d',' -f4 items.csv | sort | uniq -c` to pipe that through `sort` and through `uniq -c` . You'll see the count of unique country codes.

Try using an input redirect: `cut -d',' -f4 < items.csv | sort | uniq -c` . 

- You can move that redirect to the front of the command: `< items.csv cut -d',' -f4 items.csv | sort | uniq -c` .
- You can use `cat` and a `|` to do (much) the same: `cat items.csv | cut -d',' -f4 items.csv | sort | uniq -c` .

By now, you'll be frustrated that one of those codes is not a country code? Use `tail -n +2` to cut out the top line. 

#### how I did that...

`< items.csv | tail -n +2 | cut -d',' -f4 | sort | uniq -c`

Let's use `sort -nr` and `head -3` to see just the three countries with the greatest supply.

#### how I did that...

\`< items.csv | tail -n +2 | cut -d',' -f4 | sort | uniq -c | sort -nr | head -3\`

Use `>` to put that output somewhere permanent.

## Exercise 2 – split up `find`'s output

`find` has different outputs. It sends names of files found to *stdout*, and errors to *stderr*. Generally, *stdout* goes to the terminal (as a reply to your command), and so does *stderr*. If you're looking for one file on a disk, and you've got a heap of permission problems, you'll see mainly permission problems. 

Let's use the following, without `sudo`

`find / -name items.*`

compare with

`find / -name items.* 2>/dev/null`

The `2>` sends all the permission problems to `dev/null`, which is unix's bottomless pit, so you won't see permission problems at all. 

Use `>` to send stdout to a file (leaving stderr visible)

Use `&2>` to send stderr to a file (leaving stdout visible)

## Exercise 3 – reading a command

What does this do?

```
find /var/log -type f -print0 | xargs -0 file --mime-type | cut -d: -f2- | tr -d ' ' | sort | uniq -c | sort -nr

```

*(sorry that it doesn't wrap...)*

You can use it and try cutting bits out to see experimentally, or ask an LLM.

#### I reckon it...

- lists all the files in `/var/log` – and lists them safely and with `null` delimiters
- uses `xargs` to split at the nulls
- passes them to the `file` command, asking for the type
- cuts out the filetype column
- strips whitespace
- makes a count of type
- sorts by most common type

## Exercise 4 – last 10 lines of recent logs

This uses redirections – and also `xargs`, which runs code on each line of input

- list files (with paths), sorted by recentness
- take the top 3
- show the most recent 10 line of use those files-with-paths

`sudo ls -1td /var/log/* | head -3 | xargs -I {} sh -c ' sudo tail -10 {} '`

do this to add a descriptive line between log files

`sudo ls -1td /var/log/* | head -3 | xargs -I {} sh -c 'echo "=== {} ==="; sudo tail -10 {}'`

Note the double `sudo`... one for the `ls`, and a different one for the `tail` inside the `xargs` block.

---

sprue from here...

## Exercise 4 – streaming into `tail`

## Exercise 5 – overwriting and appending