Unsound & Incomplete

Yes… No and Other Corners of Coreutils

About a decade ago, I wanted to do some deep program analysis on GNU Coreutils. The analysis didn’t get too far, but, in the process, I did become familiar with some lesser-known Coreutils functionality that’s come in handy surprisingly often since then, shared below.

Automating Responding to Prompts

The yes program, by default, prints lines containing “y” endlessly to its output. This is meant to automatically drive a process that asks for repeated confirmations. Surprisingly, yes can take arguments, in which case, instead of “y,” yes prints its arguments, in order, separated by a single space between each. So, for example, you can use yes n to deny, rather than accept, all confirmation prompts.

My main use for yes with arguments has nothing to do with confirmation prompts, however. Rather, every now and then, some process that sends mail goes haywire, creating a mess that needs to be cleaned up via the mail program. Rather than open mail and press the d key over and over to delete everything, I run yes d | head -100 | mail.

Joining on Columns

The join program allows joining records by column, which can often eliminate the need to import data into another system like a database or spreadsheet.

Finding Common Lines

The diff program for finding lines that differ between two files is well known. When you want to know what lines two files have in common, use comm.

Sampling Lines

The shuf program outputs lines in a random order. This is useful, especially in combination with head, for getting a random sample.