Лучше всего настроить в системе демон защищенной оболочки (если он еще не запущен) и использовать аутентификацию по паре ключей без пароля. Предполагая, что sshd
уже установлен, вы можете войти в систему как tiger
и выполнить следующие команды:
ssh-keygen
ssh-copy-id jenk@localhost
После этого tiger
сможет запустить команда как jenk
со следующим синтаксисом:
ssh jenk@localhost '(some command here)'
Например:
tiger@hostname $ ssh jenk@localhost 'whoami'
jenk
tiger@hostname $
Вы можете использовать pcregrep , который доступен в большинстве дистрибутивов. Следующая команда соответствует фиксированной строке.
pcregrep -Mc '^2\n5\n4$' input.txt
На справочной странице pcregrep — это «grep с Perl -совместимыми регулярными выражениями».
-M
:соответствие регулярному выражению в нескольких строках -c
:выводить количество спичек (count ), вместо самих спичек ^2\n5\n4$
:регулярное выражение для 2, 5, 4, каждое на отдельной строке. В более поздних комментариях к вопросу предполагается, что шаблон для сопоставления не является фиксированной строкой, а представляет собой общую «строку со 2 по 4». Здесь,вместо этого вы можете использовать подстановку команд для анализа строк из входного файла.
pcregrep -Mc "^\Q$(sed -n 2,4p input.txt)\E$" input.txt
tail -n+2 input.txt
:вывести файл, начиная со строки 2 включительно head -n3
:выводить только первые три строки \Q...\E
:цитата часть ...
для сопоставления базовой строки в отличие от сопоставления с регулярным выражением (предполагает, что вывод команды не содержит\E
). Обратите внимание, что предполагается, что последние строки вывода sed... input.txt
не пусты, поскольку подстановка команды($(...)
)удаляет все завершающие символы новой строки.
В вашем сообщении не упоминается требование поддержки регулярных выражений, поэтому я предполагаю, что вы будете искать фиксированные буквальные текстовые строки.
Вероятно, это не самый быстрый алгоритм, который вы когда-либо видели, но он работает, если у вас есть достаточно времени. У него есть небольшой дефект: если имеется более одного N -шаблонов строк, которые начинаются с одной и той же первой строки и имеют один и тот же хеш SHA256, это даст неверные результаты. Предполагается, что все возможные шаблоны строк N -будут иметь уникальные хэши SHA256.
Это будет утомительно медленно для больших файлов, особенно тех, которые содержат многочисленные вхождения первой строки шаблона.
#!/usr/bin/env bash
# What's the name of the list file?
LIST=list
# What's the name of the pattern file?
PATTERN=pattern
# We'll figure out how many times the pattern lines appear (consecutively) in the list.
# Where's your SHA256 tool?
SHA256=/sbin/sha256
# what's the first line of pattern?
PATTERN_START="$(head -1 $PATTERN)"
# where in the list does that single line appear (what line numbers?)
START_LINES="$(grep -nx "$PATTERN_START" $LIST | sed -e 's/:.*//')"
# how many lines long is the pattern?
PAT_LEN="$(grep -c ^ < $PATTERN)"
echo Pattern is $PAT_LEN lines long, and might start at any of these lines:
echo $START_LINES
PAT_HASH="$($SHA256 < "$PATTERN")"
# So how many times does $PATTERN appear consecutively in $LIST?
PAT_COUNT=0
for LINE in $START_LINES
do
HASH="$(tail +$LINE $LIST | head -$PAT_LEN | $SHA256 -q)"
if [ "$HASH" = "$PAT_HASH" ]
then
echo match at line $LINE
PAT_COUNT=$(($PAT_COUNT+1))
fi
done
echo The pattern was found $PAT_COUNT times
Выход:
$ cat list
3
2
5
4
8
2
5
4
2
4
2
5
4
$ cat pattern
2
5
4
$. foo.sh
Pattern is 3 lines long, and might start at any of these lines:
2 6 9 11
match at line 2
match at line 6
match at line 11
The pattern was found 3 times
$ perl -l -0777pe '$_=()=/^2\n5\n4$/mg' input_file
3
Работа:
-0777
=> режим slurp, что означает чтение всего файла. -p
=> перед чтением следующей записи вывести текущую запись, $_
в стандартный вывод.-l
=> установить RS = ORS = "\n" /^2\n5\n4$/mg
неявно применяется к $_
, что в нашем случае является запоминанием всего файла. модификатор регулярного выражения /m
должен соответствовать концам и началам строк, кроме начала и окончания строки. Модификатор /g
получит все совпадения в $_
или во всем файле. ХТХ
Как насчет
a="2 5 4"; tr '\n' ' ' < test | grep -o "[^0-9]$a[^0-9]" | wc -l
С выбранным разделителем....
Вам нужно регулярное выражение, чтобы предотвратить совпадение в случае.... 22 5 44
... или аналогичного
mpc() {
# mpc: multiline-pattern counter
# the first argument $1 is the first line number to include in the pattern
# the second argument $2 is the last line number to include in the pattern
# the third argument $3 is the input file
line_count=$(( $2 - $1 + 1 ))
multiline_pattern=$(head -n $2 "$3"| tail -n $line_count)
awk -v RS='' -v FPAT="$multiline_pattern" '{print NF}' "$3"
}
# count how many times multiline-pattern defined by lines 2 to 4 (inclusive) occurs
mpc 2 4 input_file
Требование:
Второй аргумент должен быть как минимум больше или равен первому аргументу. Я не гарантирую результат, если вы его нарушите.
Отказ от ответственности:
Это не работает, если символы \
и/или $
появляются в любой из строк, включенных в шаблон. awk
изо всех сил пытается обработать эти символы как часть шаблона, даже если они экранированы обратной косой чертой -.