Вам вообще не нужен grep
, awk
может выполнить сопоставление с шаблоном номера порта.
awk
также может отслеживать, был ли найден порт, и завершать работу с соответствующим кодом выхода.
Например:
$ port=23
$ awk '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services
telnet
$ echo $?
0
$ port=99999
$ awk '$2 ~ /^'"$port"'\// {print $1 ; found=1} END {exit !found}' /etc/services
$ echo $?
1
exit! Найден
работает, потому что переменные awk
по умолчанию равны нулю (или истинны), если они не были ранее определены - exit! 0
- это выход 1
. Итак, если мы установим found = 1
при сопоставлении, то exit! Found
в блоке END будет exit 0
.
Вот как использовать этот awk-скрипт с if / then / else.
#!/bin/bash
awk '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services
if [ $? -eq 0 ]; then
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi
Вы также можете сделать это так:
if awk '$2 ~ /^'"$1"'\// {print $1;found=1} END{exit !found}' /etc/services ; then
echo "Service(s) is(are) found correctly!"
else
echo "There is(are) no such service(s)!"
fi
Или даже так:
awk '$2 ~ /^'"$1"'\// {print $1 ; found=1} END {exit !found}' /etc/services \
&& echo "Service(s) is(are) found correctly!" \
|| echo "There is(are) no such service(s)!"
Когда вы связываете команду sed
с &&
, вы указываете оболочке выполнять эту команду отдельно. Это оставило только вывод cat... cut... sort
, а затем также напечатал 2-ю строку без какой-либо обрезки.
Если вы хотите напечатать только вторую (отсортированную )строку ввода, измените ее на:
cut -d ' ' --fields=2,3 | sort | sed -n 2p
Нет необходимости повторять /dev/stdin, так как и cut
, и sed
будут читать стандартный ввод, если вы не предоставите входной файл.
Чтобы распечатать поля из файла, разделенные вторым и третьим пробелом -, а также напечатать всю вторую строку, вы можете сделать все это в sed:
sed -e 2p -e 's/^[^ ]* //' < report.txt | sort
Это говорит sed two выполнить две программы:
p
rint строка 2 и s
поиск и замена :с начала строки, ноль или более не -пробельных символов, за которыми следует пробел... с:(ничего)При запуске вашего обновленного образца ввода я получаю:
Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sakib Khata 3
Sharpner 1
... так как Sakib Khata 3
это 2-я строка файла.
Считать содержимое /dev/stdin
в переменную:
content=$(cat)
echo "$content" | cut -d ' ' --fields=2,3 | sort
echo "$content" | sed -n '2p'
cat
по умолчанию читает из stdin
.
Пример:
(
content=$(cat);
echo "$content" | cut -d ' ' --fields=2,3 | sort;
echo "$content" | sed -n '2p'
) < <(echo -e "a b c\nd e f\ng h i\n")
b c
e f
h i
d e f
Обновление:
Пример из вашего отредактированного вопроса
echo 'Jakaria Books 5
Sakib Khata 3
Afzal Pen 12
Sharif Colorpen 2
Sakib Eraser 1
Sharif Sharpner 1' | (
content=$(cat);
echo "$content" | cut -d ' ' --fields=2,3 | sort;
echo "$content" | sed -n '2p'
)
Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sharpner 1
Sakib Khata 3