Передача $ * с параметрами с местами второму сценарию

Лучше всего настроить в системе демон защищенной оболочки (если он еще не запущен) и использовать аутентификацию по паре ключей без пароля. Предполагая, что 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 $
2
26.01.2019, 02:15
5 ответов

Вы можете использовать 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не пусты, поскольку подстановка команды($(...))удаляет все завершающие символы новой строки.

2
27.01.2020, 22:02

В вашем сообщении не упоминается требование поддержки регулярных выражений, поэтому я предполагаю, что вы будете искать фиксированные буквальные текстовые строки.

Вероятно, это не самый быстрый алгоритм, который вы когда-либо видели, но он работает, если у вас есть достаточно времени. У него есть небольшой дефект: если имеется более одного 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
0
27.01.2020, 22:02
$ perl -l -0777pe '$_=()=/^2\n5\n4$/mg' input_file
3

Работа:

  • -0777=> режим slurp, что означает чтение всего файла.
  • -p=> перед чтением следующей записи вывести текущую запись, $_в стандартный вывод.
  • -l=> установить RS = ORS = "\n"
  • регулярное выражение /^2\n5\n4$/mgнеявно применяется к $_, что в нашем случае является запоминанием всего файла. модификатор регулярного выражения /mдолжен соответствовать концам и началам строк, кроме начала и окончания строки. Модификатор /gполучит все совпадения в $_или во всем файле.
  • Мы делаем это в контексте списка -и присваиваем его пустому списку. Таким образом, переменной $_присваивается значение re -с количеством элементов в списке, которое представляет собой количество совпадений с регулярным выражением.

ХТХ

1
27.01.2020, 22:02

Как насчет

a="2 5 4"; tr '\n' ' '  < test | grep -o "[^0-9]$a[^0-9]" | wc -l

С выбранным разделителем....

Вам нужно регулярное выражение, чтобы предотвратить совпадение в случае.... 22 5 44... или аналогичного

0
27.01.2020, 22:02
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изо всех сил пытается обработать эти символы как часть шаблона, даже если они экранированы обратной косой чертой -.

0
27.01.2020, 22:02

Теги

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