How to separate fields with pipe character delimiter
Asked Answered
D

2

9

I know this question has already been asked but no of the solution I've found worked for me! I have a program that has an output like this:

COUNT|293|1|lps

I'm interested in having the second field however no one of these tries worked:

./spawn 1 | cut -d '|' -f2
./spawn 1 | cut -d \| -f2
./spawn 1 | awk -F "|" '{print $2}'
./spawn 1 | awk 'BEGIN{FS="|"} {print $2}'
./spawn 1 | sed 's/|/;/g'
./spawn 1 | sed 's/\|/;/g'

But the output is always the same:

COUNT|293|1|lps

Is there a bug somewhere in bash? I would be surprised, the results is the same on my Linux host and on my embedded device using busybox's ash! Any pointer is strongly appreciated!

EDIT My fault, the output was in stderr ... ._.

./spawn 1 2>&1 | cut -d '|' -f2
4615

Sorry for ennoying!

Drugge answered 26/1, 2012 at 13:22 Comment(1)
Just a guess, but is it possible that ./spawn 1 is printing to standard error instead of standard output? Does ./spawn 1 2>&1 | cut -d '|' -f2 work, for example?Kittrell
K
11

Just repeating what I guessed in a comment as an answer, now that the questioner has confirmed that this is the problem.

The problem here is that ./spawn 1 is outputting to standard error, not standard output. You can redirect the output using 2>&1, so the following should work:

./spawn 1 2>&1 | cut -d '|' -f2
Kittrell answered 26/1, 2012 at 13:43 Comment(0)
T
2
$ echo 'COUNT|293|1|lps' | cut -d'|' -f2
293

It works here.

Trixy answered 26/1, 2012 at 13:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.