Always include first line in grep
I often grep CSV files with column names on the first line. Therefore, I want the output of grep to always include the first line (to get the column names) as well as any lines matching the grep pattern. What is the best way to do this?
Solution 1:
sed:
sed '1p;/pattern/!d' input.txt
awk:
awk 'NR==1 || /pattern/' input.txt
grep1:
grep1() { awk -v pattern="${1:?pattern is empty}" 'NR==1 || $0~pattern' "${2:-/dev/stdin}"; }
Solution 2:
grep doesn't really have a concept of line number, but awk does, so here's an example to output lines contain "Incoming" - and the first line, whatever it is:
awk 'NR == 1 || /Incoming/' foo.csv
You could make a script (a bit excessive, but). I made a file, grep+1, and put this in it:
#!/bin/sh
pattern="$1" ; shift
exec awk 'NR == 1 || /'"$pattern"'/' "$@"
Now one can:
./grep+1 Incoming
edit: removed the "{print;}", which is awk's default action.