Відповіді:
Це можна зробити за допомогою cut
:
cut -d _ -f 1
напр
$ echo host100_044 2 | cut -d _ -f 1
host100
Також awk
це можна зробити за допомогою awk -F_ '{print $1}'
(можливо, існує більш чистий спосіб зробити це)
Ще одна альтернатива sed:
echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'
Якщо вони є у файлі, ви можете назвати його наступним чином;
cat fileName | sed 's/^\(.*\)_.*$/\1/'
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}' | cut -d ' ' -f2-
Вихід:
host100 host101 host102
З новими рядками:
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'
Вихід:
host100
host101
host102
Використання sed
:
echo host100_044 2 | sed 's;_.*;;'
Використовуючи sed
опцію редагування на місці,
sed -i.old 's;_.*;;' infile
awk
рішення вже розміщено (і cut
, мабуть, найкраще в цьому випадку), оскільки він про це запитав sed
, але ти бив мене секундами :-). Ви навіть можете зняти смужку $
, оскільки вона .*
за замовчуванням буде відповідати кінці рядка.
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100
У -F'_'
інструктує awk
використовувати знак підкреслення в якості поля роздільників. Сам awk
сценарій просто друкує перше поле.
Це надрукує вихід раніше _
:
sed 's/_.*//' -filename