Back to News
Advertisement
Advertisement

⚡ Community Insights

Discussion Sentiment

33% Positive

Analyzed from 991 words in the discussion.

Trending Topics

#file#cat#piping#command#more#less#process#files#grep#awk

Discussion (41 Comments)Read Original on HackerNews

jasongi34 minutes ago
The beauty of cat is that streams are the universal interface.

Program A might accept a file as the last positional arg. Program B might accept it as a named arg, where the name/flag could be anything from --input or -f or --file etc.

But a program will read from STDIN, which all good unix programs do, then piping cat into it works every time. I can write the cat foo.txt part before I even know what command I'm piping it into.

fuzzybear396526 minutes ago
This. Sometimes I want to see what I'm looking at and then (using that dump as a reference) follow up with a corresponding filter (| jq .key, or | tail -n 30). Sure, I could use less, but then I context switch on exit; no support from the scrollback buffer.

I've probably lost 10ms * 1E5 of my life from the extra PID. But, probably would lose more in the context switch.

1-more7 minutes ago
I'm never doing just one thing to a file! I'm grepping and JQing and then piping it to JQ again because I'm kind of dumb (and it's faster to do what I do know how to do than it is to look up the perfect way to do it), then I'm outputting as a TSV and piping that to `column -ts $'\t'`. ^r reveals a decent example:

    cat expected.1376| sed '1,4d' | rg '(\t\d)\t.*' --replace '$1' | column -ts $'\t'
I was figuring shit out along the way and it'd be pretty annoying to adjust which command gets the filename throughout that process.

You know what? I'll tell you another thing I do that's similar:

    SELECT * FROM whatever WHERE true
        AND last_modified > 123
        AND otherfield NOT NULL
Always bugged me that you say WHERE for the first one and AND thereafter, so if I'm poking around the database trying to create actionable insights for key stakeholders at the speed of business just as I was above with the text file, I like to be able to futz and delete/add clauses as I see fit just as I do pipeline stages.
oogali13 minutes ago
alias less=‘less -X’
hn_throwaway_9917 minutes ago
Yeah, I read TFA, and my eyes were rolling the whole time. Some people really have a bee in their bonnet that "cat" is named that way because it was originally for concatenating files. Nobody fucking cares. It's the standard way for writing a file to standard out, and the general pattern of "cat file.txt | somecommand | othercommand | anothercommand" is so useful because it follows the pipeline pattern so well - read from standard in, write to standard out - that is the cornerstone of Unix shell commands IMO.

"Oh no, it spawns another process!!" Again, nobody cares.

internet2000about 1 hour ago
> Piping a single file through cat spawns an entire process whose only job is to copy bytes to a program that already knew how to read them.

Chrome probably spawned two processes when I cmd+clicked this into a new tab. It really doesn't matter.

MPSimmons43 minutes ago
Unless you're executing these commands in a loop over a large number of items, or the item itself is gargantuan, it's almost always harmless.

Personally, when I'm exploring, I build a command line iteratively. Cat the file to see the content, pipe to grep to get the lines I want, sed/awk/cut/etc to finagle from there.

florenabout 1 hour ago
if this wanton abuse of cat(1) doesn't stop, we're on track to run out of PIDs by 2031! Just because Unix makes it cheap and easy to fork doesn't mean you have to!

(who gives even a single shit, my god)

copperxabout 1 hour ago
I like piping the output of cat and the mental image of one process feeding another. It's inconsequential, but it brings an epsilon of joy.
djtriptych34 minutes ago
same I just like monads lol. cat + pipe feels purer and has lower mental load for me, which dominates the efficiency of spawning an extra process for, typically, a few microseconds.
floralhangnail24 minutes ago
Is this a dig at IPv6?
floren5 minutes ago
Definitely not, I like IPv6.
collabs17 minutes ago
Everything reminds me of her (IPv6) T_T

Edit: for context my home router is a TP Link and for some reason it has IPv6 disabled completely and I'm too scared to enable it.

lifthrasiirabout 1 hour ago
Don't do this:

  cat file | wc -l            => wc -l < file
  cat file | head -n 5        => head -n 5 file
  cat file | awk '{print $1}' => awk '{print $1}' file
  cat file | sort             => sort file
Do this instead:

  cat file | wc -l            => <file wc -l
  cat file | head -n 5        => <file head -n 5
  cat file | awk '{print $1}' => <file awk '{print $1}'
  cat file | sort             => <file sort
The front-cat abuse is all about the order. The effective solution needs to keep the relative order of arguments.
stousetabout 1 hour ago
Or just use cat and spend your brainpower on interesting, useful, and/or worthwhile topics. It boggles my mind that anyone cares about this.
soraminazuki5 minutes ago
If one needs brainpower to just use the redirection operator, it shows a likely lack of understanding of basic concepts in computing like processes and files. That should be concerning.
lifthrasiirabout 1 hour ago
Probably, but knowing that redirection operators can be freely moved within normal arguments [EDIT: thank ButlerianJihad for pursuing me to make this more accurate] is useful.
ButlerianJihadabout 1 hour ago
They are actually not “order-independent”, and their L-R parsing/processing is why constructs such as

  cat file > /dev/null 2>&1
work as intended.
peteeabout 3 hours ago
> Since 1995, occasional awards for UUOC have been given out, usually by Perl luminary Randal L. Schwartz

http://catb.org/jargon/html/U/UUOC.html

Admittedly its taken me a long time to remember that the file is the last argument to grep, when so many other commands its the first. I'd guess common abuse is due to being easier to type cat x | than to dig up the man page

smelendezabout 2 hours ago
And also typing cat x to get a quick look at the file, hitting up, then piping that into another command and taking a look, hitting up, piping that result into a third command etc.
soraminazuki14 minutes ago
I suppose a lot of people use less rather than cat for looking at files though.

`alt + .` is much more versatile. You can use it to cycle through and insert the last arguments of previous commands.

js2about 2 hours ago
It's that way so that you can grep multiple files with a single pattern. It would be odd for the pattern to come after the file arguments. It also allows the files to be optional so that it can grep stdin.
soraminazukiabout 2 hours ago
The redirection operator is consistent and requires less typing though.

I guess the file is usually the last argument because it's the one that can be omitted.

copperx41 minutes ago
I'll make a note of it in my AGENTS.md file.
antonvsabout 2 hours ago
Presumably written by someone without much interactive shell experience.

When you're building a pipeline, putting cat first can often be quite convenient. Essentially, it's more composable: it defines the input to the pipeline without committing to a specific tool. For example, you can up-arrow in the shell and change the part after the pipe without having to skip back past the filename.

In fact if you don't start with cat, it's possible you're more of a script kiddie than a software developer.

dminvsabout 1 hour ago
"Don't be a catgrepper"

- various HostGator employees, c. 2011

Shadowmistabout 2 hours ago
I’m going to keep doing it but wouldn’t mind it if my shell auto replaced it for me.
jmclnxabout 2 hours ago
In this day an age this is still making rounds ? So this is the memory usage of cat on my system:

     VSZ   RSS    SZ CMD
    3252  1608   813 /bin/cat
To me there are far more things to worry about than cat. How about your multi-gig browser for one ?

Now for firefox:

        VSZ    RSS     SZ CMD
    3472212 395968 868053 /usr/lib64/firefox/firefox
Maybe people should be looking at that ? I will not even get into modern Linux Desktops :)
Advertisement
pyrolisticalabout 2 hours ago
I like putting the stdin before the command

< file grep abc

spriorabout 1 hour ago
I raised eyebrows recently when I was working with someone and we needed to create a file and instead of starting an editor I did: cat > filename ... Ctrl-D
bonsai_spoolabout 1 hour ago
Why not touch or echo? No reason for an editor or cat
stousetabout 1 hour ago
You can type the intended file contents as-is.
spriorabout 1 hour ago
For a one line file sure, but I was creating multiple lines.