Bash: How to trim whitespace before using cut

2020-07-02 12:33发布

问题:

I have a line of output from a command like this:

[]$ <command> | grep "Memory Limit"
Memory Limit:           12345 KB

I'm trying to pull out the 12345. The first step - separating by the colon - works fine

[]$ <command> | grep "Memory Limit" | cut -d ':' -f2
           12345 KB

Trying to separate this is what's tricky. How can I trim the whitespace so that cut -d ' ' -f1 returns "12345" rather than a blank?

回答1:

Pipe your command to awk, print the 3rd column, a space and the 4th column like this

<command> | awk '{print $3, $4}'

This results in:

12345 KB

or

<command> | awk '{print $3}'

if you want the naked number.



回答2:

tr helps here.

$ echo "Memory Limit:           12345 KB" | tr -s " " | cut -d " " -f3
12345
  • tr -s " " - squeeze all spaces into one
  • cut -d " " -f3 - split into columns by space and select third


回答3:

You can use awk and avoid using any cut, sed or regex:

<command> | awk '/Memory Limit/{print $(NF-1)}'

12345
  • /Memory Limit/ will make this print only a line with Memory Limit text
  • $(NF-1) will get you last-1th field in input.


回答4:

do you have to use cut? cut is only for single character delimiter extraction. i don't think cut can be as easy as you would expect.

sed is straightforward:

$ echo "Memory Limit:           12345 KB" | sed 's/.*:\s*//'
12345 KB

explanation:

.*:\s* matches all letters before the last colon, then matches all the empty chars after that and delete them by substituting to an empty string.


it turns out that you were expecting a single number. then i would say just go ahead and match the numbers:

$ echo "Memory Limit:           12345 KB" | grep -o -P '\d+'
12345


回答5:

bash also has regular expression matching you can use.

result=$(<command> | grep "Memory Limit")
regex='Memory Limit:[[:space:]]+([[:digit:]]+)[[:space:]]KB'
if [[ $result =~ $regex ]]; then
  result=${BASH_REMATCH[0]}
else
  # deal with an unexpected result here
fi

The value of $regex can be adjusted as necessary.



回答6:

awk is perhaps the best for this task, but here is an unorthodox way

$ grep -oP "(?<=Memory Limit:)\s+[0-9]+" file | xargs

lookbehind for matching the label and output only matching, use xargs to eat up spaces



标签: bash trim cut