Linux: Как команда sed может фильтровать все поля, кроме первого и последнего? - PullRequest
2 голосов
/ 15 декабря 2011

Я пытаюсь сделать этот скрипт, который фильтрует строку, приходящую от PS .. сценарий почти готов, только эта строка отсутствует.

например, вот строка, которую мне нужно отфильтровать:

803 ?   (many spaces here)   00:00:00 atd

Мне нужно, чтобы это выглядело так:

803 atd

Я попробовал все, но кажется, что простой аргумент sed не может этого сделать ... если sed обнаруживает что-то, что должно быть удалено, он удаляет всю строку после него пожалуйста, поправьте меня, если я ошибаюсь, и спасибо за ваше время ..

Ответы [ 3 ]

5 голосов
/ 15 декабря 2011

Похоже, вы ищете awk.

awk '{print $1 " " $NF}' печать 1-го поля и последнего поля каждой строки ввода.NF на самом деле количество полей.

$> echo "803 ? (many spaces here) 00:00:00 atd" | awk '{print $1 " " $NF}'
803 atd
2 голосов
/ 15 декабря 2011

Попробуйте эту команду для sed:

sed 's/ .* / /'

Он берет первый пробел, насколько это возможно, затем последний пробел и заменяет их одним пробелом.

Если у вас могут быть пробелы в начале или конце строки, то вам нужно быть немного осторожнее с командой sed. Здесь не все так элегантно:

sed 's/^ *\([^ ]\+\).*  *\([^ ]\+\) *$/\1 \2/'

Это захватывает непробельные символы и помещает их в выходной поток. Без расширенного sed, такого как GNU sed, вам нужно заменить вхождения [^ ]\+ на [^ ][^ ]*.

Как говорится, awk явно самый изящный инструмент для этой работы.

2 голосов
/ 15 декабря 2011

На самом деле, вы можете сделать это, возможно, легче с помощью Perl или AWK, ...

    perl -ane 'print "$F[0] $F[-1]\n"' # first and last field

    awk '{print $1 " " $6}'            # first and sixth field
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...