Использование команды CUT и SED одновременно в скрипте

Вам вообще не нужен 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)!"
1
22.08.2018, 20:11
2 ответа

Когда вы связываете команду 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 выполнить две программы:

  • print строка 2 и
  • sпоиск и замена :с начала строки, ноль или более не -пробельных символов, за которыми следует пробел... с:(ничего)

При запуске вашего обновленного образца ввода я получаю:

Books 5
Colorpen 2
Eraser 1
Khata 3
Pen 12
Sakib Khata 3
Sharpner 1

... так как Sakib Khata 3это 2-я строка файла.

3
27.01.2020, 23:18

Считать содержимое /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
1
27.01.2020, 23:18

Теги

Похожие вопросы