У меня есть файл, который возвращает следующий текст:
10.10.10.160:1111
10.10.10.170:2222
10.10.10.180:3333
grep -m 1 -o '.*' filename | cut -d ':' -f
Я попробовал описанное выше и могу получить только 1 сингл строка вывода.
10.10.10.160
Однако, когда я попробовал с
grep -m 2 -o '.*' filename | cut -d ':' -f
10.10.10.160
10.10.10.170
, я получил вышеуказанное.
Если я хочу получить только вторую строку
10.10.10.170
Есть ли способ сделать это?
grep -m 2 -o '.*' filename | cut -d ':' -f 1 | tail -n 1
Результаты:
10.10.10.170
tail -n 1
печатает только последнюю строку результатов grep -m 2 -o '. *' Filename | cut -d ':' -f 1
Исходный текстовый файл называется filename.
Вы можете сделать это только с помощью оболочки (при условии bash), без использования каких-либо других утилит:
{
read
IFS=: read ip port
echo $ip
} < input.txt
Начиная с конца, <
перенаправляет input.txt в группу команд {}
. Первое чтение
затем считывает 1 строку и отбрасывает ее. Второе чтение
читает следующую строку, а IFS
разделяет ее двоеточием :
. Второе чтение
заполняет переменные ip
и порт
1-м и 2-м элементами второй строки. Переменная $ ip
является выводом echo
.
Вы можете использовать эту команду sed
:
sed -e '2!d' -e 's/:.*//' filename
или, более компактно:
sed '{2!d; s/:.*//; q;}' filename
2! D
сообщает sed
, чтобы удалить ( d
) все строки, кроме (!
) второй ( 2
) строки. 's /:.*//'
сообщает sed
удалить все после :
(включая :
). q
используется для прекратить операцию сразу после ее завершения (полезно для больших файлов - спасибо @JoL за предложение). Я бы предложил awk для такого рода задач:
awk -F: 'NR==2 {print $1}' filename
В качестве альтернативы sed:
sed -n '2s/:.*//p' filename
Если размер файла большой , вы можете изменить его на
awk -F: 'NR==2 {print $1; exit}' filename
и
sed -n '2{s/:.*//p;q;}' filename
соответственно, чтобы избежать ненужной обработки последующих строк.