Как написать сценарий оболочки, который будет подсчитывать и выводить / выводить, сколько изменений было внесено при выполнении команды SED ...

Например: давайте использовать команду SED, чтобы удалить каждую строку, если она соответствует определенному символу.

sed '/@gmail.com/d' F1.txt > RESULT.txt

Файл F1.txt содержит:

abc123@gmail.com
zyz123@gmail.com
fgh456@yahoo.com
ght4789@msn.com

Выход этого файла будет:

fgh456@yahoo.com
ght4789@msn.com

Поэтому он сопоставил две строки и удалил две строки.

Теперь, как повторить это в сценарии Shell с Echo, предлагая, сколько строк было изменено / удалено этой командой SED?

Должен звучать и Print/Echo, 2 строки где удалены. Не могли бы вы помочь, как сделать этот сценарий оболочки?

#!/bin/bash
sed '/@gmail.com/d' F1.txt > RESULT.txt

2 ответа2

2

Вот один из способов сделать это:

echo $(( $(wc -l < F1.txt) - $(wc -l < RESULT.txt) ))

wc -l - это число строк, и < делает его читаемым из "стандартного ввода" (что по сути является хаком, чтобы не печатать имя файла)

Каждый wc обернут в $() который просто подставляет в вывод.

$(( ... )) является арифметикой оболочки (как кто-то сказал в комментарии). Обратите внимание на знак минус в середине.

Переменные могут сделать это более понятным; вот другая версия того же самого:

all=$(wc -l < F1.txt)
sed=$(wc -l < RESULT.txt)
echo $(($all - $sed))
1

Если вы хорошо делаете это с двумя командами, вы можете сделать что-то вроде следующего:

NUM_DELETIONS=$( grep "@gmail.com" F1.txt | wc -l )
sed '/@gmail.com/d' F1.txt > RESULT.txt

echo "${NUM_DELETIONS} lines were deleted from F1.txt"

Если вы хотите написать его как быстрый и грязный скрипт bash , вы можете подумать о том, чтобы сделать это так:

#!/bin/bash

usage(){
    echo "$0 <source_file> <output_file> <removal_text>"
}

SOURCE_FILE="${1}"
OUTPUT_FILE="${2}"
REMOVAL_TEXT="${3}"

[[ ! -r "${SOURCE_FILE}" ]] && usage && exit 1
[[ -z "${REMOVAL_TEXT}" ]] && usage && exit 1

NUM_DELETIONS=$( grep "${REMOVAL_TEXT}" "${SOURCE_FILE}" | wc -l )
sed "/${REMOVAL_TEXT}/d" "${SOURCE_FILE}" > "${OUTPUT_FILE}"

echo "${NUM_DELETIONS} lines were deleted from "${SOURCE_FILE}""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .