Мне нужна помощь, чтобы понять, как использовать команду sed, чтобы отображать только первый и последний столбцы в текстовом файле. Вот то, что я пока имею для колонки 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Моя слабая попытка получить последний столбец, чтобы показать, была:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Однако это берет первый столбец и последний столбец и объединяет их в один список. Есть ли способ распечатать первый и последний столбцы с помощью команд sed и awk?
Пример ввода:
foo|dog|cat|mouse|lion|ox|tiger|bar
Ответы:
Почти готово. Просто поместите обе ссылки на столбцы рядом друг с другом.
Также обратите внимание, что вам
cat
здесь не нужно .Также обратите внимание, что вы можете сказать,
awk
что|
вместо пробелов используются разделители столбцов , так что вам это тоже не нужноsed
.В соответствии с предложениями по Халева , если вы хотите , решение , которое до сих пор выводит последнее поле, даже если не совсем восемь, вы можете использовать
$NF
.Кроме того, если вы хотите, чтобы выходные данные сохраняли
|
разделители, вместо использования пробела можно указать разделители выходных полей. К сожалению, это немного более неуклюже, чем просто использование-F
флага, но вот три подхода.Вы можете назначить разделители полей ввода и вывода
awk
сами по себе, в блоке BEGIN.Вы можете назначить эти переменные при вызове
awk
из командной строки через-v
флаг.или просто:
источник
|
в качестве разделителя вывода вместо пространства по умолчанию для конкатенации строк. Также вы можете объяснить использовать$NF
вместо жесткого кодирования,$8
чтобы получить последний столбец.Просто замените от первого до последнего
|
символом|
(или пробелом, если хотите):Обратите внимание, что, хотя нет специальной
sed
реализации, в которой|
есть особенность (если расширенные регулярные выражения не разрешены с помощью-E
или-r
в некоторых реализациях),\|
сама по себе она особенная в некоторых, таких как GNUsed
. Так что вам не следует убегать,|
если вы хотите, чтобы он соответствовал|
характеру.Если заменить на пробел и если входные данные могут уже содержать строки только с одной
|
, то вам нужно будет обработать это специально, так как|.*|
они не будут соответствовать этим. Это может быть:(то есть сделать
.*|
часть необязательной) Или:или:
Если вам нужно первое и восьмое поля независимо от количества полей во входных данных, то это просто:
(все они будут работать с любой POSIX-совместимой утилитой, если предположить, что входные формы имеют корректный текст (в частности,
sed
они, как правило, не будут работать, если на входе есть байты или последовательности байтов, которые не образуют допустимых символов в текущей локали, как, например,printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
в язык UTF-8)).источник
Вы используете в
awk
любом случае:источник
|
скорее пробел) с-F\|
или аналогично? И что если он захочет использовать тот же разделитель для вывода?Если вы обнаружите, что вам не хватает awk и sed, вы можете добиться того же с помощью coreutils:
источник
cut
он чище и более компактен, чем awk / sed, когда вас интересует только первый столбец или если фиксаторы разделены (т. е. не переменное число пробелов).Кажется, вы пытаетесь получить первые и последние поля текста, которые разделены
|
.Я предположил, что ваш файл журнала содержит текст, как показано ниже,
И вы хотите вывод, как,
Если да, то здесь идет команда для вашего
Через GNU SED,
Пример:
источник
Вы, вероятно, должны сделать это с
sed
- я бы в любом случае - но, просто потому, что никто еще не написал это:ВЫХОД
источник