Конвейер grep для вырезания

Эта строка:

echo $(grep Uid /proc/1/status) | cut -d ' ' -f 2

Производит вывод:

0

Эта строка:

grep Uid /proc/1/status | cut -d ' ' -f 2

Производит вывод:

Uid:    0   0   0   0

Моей целью был первый выход. У меня вопрос, почему вторая команда не дает ожидаемого результата. Почему я должен повторить это эхом?

Источник
  • 0
    Возможно в выводе есть ТАБЛИЧКИ
  • 0
    ааа да, это табуляция, а не пробелы! Спасибо. Я думаю, они автоматически конвертируются, когда превращаются в строку
  • 0
    С помощью GNU grep: grep -Po 'Uid:\t\K[0-9]+' /proc/1/status
  • 0
    См. grep Uid: /proc/1/status | cat -A . ^I представляет ВКЛАДКУ.
Codelisting
за 1 против
Лучший ответ

Один из способов сделать это - изменить разделитель выходного поля илиOFS переменная в оболочке bash

IFSOLD="$IFS" # IFS for Internal field separator
IFS=$'\t'
grep 'Uid' /proc/1/status | cut -f 2
0 # Your result
IFS="$IFSOLD"

или легкий путь

grep 'Uid' /proc/1/status | cut -d $'\t' -f 2

Примечание: Кстатиtab является разделителем по умолчанию для вырезания, как указано [здесь]

за 2 против

Использоватьawk

awk '/Uid/ { print $2; }' /proc/1/status
за 0 против

grep Uid / proc / 1 / status | sed -r «s / \ s + / / g» | awk '{print $ 3}'

Выход 0

за 0 против

Вам почти никогда не нужно писать что-то вродеecho $(...) - это почти эквивалентно звонку... напрямую. Пытатьсяecho "$(...)" (который вы всегда должны использовать) вместо этого, и вы увидите, что он ведет себя как... .

Причина в том, что когда$() подстановка команд вызывается без кавычек, результирующая строка разбивается Bash на отдельные аргументы перед передачей вecho , а такжеecho выводит каждый аргумент, разделенный одним пробелом, независимо от пробелов, созданных подстановкой команды (в вашем случае вкладки).

Как предложил sjsam, если вы хотитеcut вывод с разделителями табуляции, просто укажите табуляции в качестве разделителя вместо пробелов:

cut -d $'\t' -f 2
  • 1
    TAB является разделителем по умолчанию для вырезания.
  • 0
    @Cyrus хех, правда, но я думаю, что в этом контексте более полезно быть откровенным. Даже за пределами SO я бы, вероятно, все равно указал -d чтобы помочь будущим читателям кода (возможно, я!).
Codelisting
Популярные категории
На заметку программисту