Как перенести результат команды grep для переменной в другую переменную

Все, что я нашел в Интернете, похоже, указывает на то, что шифрование в настоящее время еще не реализовано драйвером файловой системы Linux cifs. Кроме того, в man-странице mount.cifs (8) моего Centos 7 для опции 'sec =' нет режима, указывающего шифрование пакета, только подписание пакета (режимы с 'i', добавленным к их обычным именам). Для сравнения, на странице руководства nfs (5) перечислены режимы с добавленной буквой «i» для подписи пакетов, а также режимы с добавленной буквой «p» для полного шифрования пакета.

Я считаю, что это еще не доступно для Linux.

0
14.02.2018, 16:56
5 ответов

Похоже, вы пытаетесь разобрать шестизначное число в именах файлов, которые начинаются с $INPUT_FILE_PREFIXи заканчиваются на $INPUT_FILE_SUFFIX.

Так и будет:

for name in "$INPUT_DIR/$INPUT_FILE_PREFIX"??????"$INPUT_FILE_SUFFIX"; do
    test -f "$name" || continue

    number=${name#$INPUT_DIR/$INPUT_FILE_PREFIX}
    number=${number%$INPUT_FILE_SUFFIX}

    printf "Number = %s\n" "$number"
done

Измените каждый ?на [0-9], если вы хотите быть уверенным, что совпадение только цифр(?соответствует одному символу независимо от того, что это за символ ).

Подстановка параметров в цикле удаляет первую часть значения $name, а затем последнюю часть оставшейся строки, оставляя число (из шести символов между префиксом и суффиксом )в середине в качестве единственное, что осталось в переменной $number.


Команда

MYDATE=$("$i" | grep -oP '\d{6,6}')
Как вы обнаружили,

будет интерпретироваться как вызов всего, что находится в $i, как команды. В то же время вы сказали, что если поставить echoперед "$i", это заставит его работать, что и происходит :

.
MYDATE=$(echo "$i" | grep -oP '\d{6,6}')

Связано с вашим кодом:Почему *не *parse `ls `?

3
28.01.2020, 02:15

Su script está pasando "$i" como una cadena, pero le está diciendo al shell que lo use como un comando. La línea que dice

MYDATE=$("$i" | grep -oP '\d{6,6}')

le dice al shell :"Expande la variable i, luego ejecuta el comando resultante $i,alimentando su salida a través de este comando grep, y asigne el resultado a la variable MYDATE". El $(...)hace lo mismo que la construcción de doble acento grave que usa con el comando echo "$i" | grep -oP '\d{6,6}'que lo hace funcionar. Simplemente necesita el echocomando en cualquiera de ellos para obtener los resultados que desea.

0
28.01.2020, 02:15

¿Has probado la sustitución del proceso bash ? Parece que haría que su comando fuera mucho más fácil y sin necesidad de bucles o variables.

Básicamente, la sustitución de procesos no es muy conocida, pero puede ser extremadamente poderosa.

Process substitution feeds the output of a process (or processes) into the stdin of another process.

entonces, su comando podría reducirse a algo como esto:

grep -oP '\d{6,6}'<(egrep -i '^'$INPUT_FILE_PREFIX'[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01])'$INPUT_FILE_SUFFIX <(ls $INPUT_DIR))

La ​​lógica detrás de esto se entiende mejor con una versión más simple:

user@yrmv-191108:~/nums$ ls.
1  10  2  3  4  5  6  7  8  9
user@yrmv-191108:~/nums$ grep 1 <(ls.)
1
10
0
28.01.2020, 02:15
for i in $(ls $INPUT_DIR | egrep -i '^'$INPUT_FILE_PREFIX'[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01])'$INPUT_FILE_SUFFIX);

В общем, нет причин использовать lsв такой структуре, это просто делает команду более неудобной для чтения, плюс вы столкнетесь с проблемами в некоторых крайних случаях (см. ParsingLs в BashGuide ). Однако регулярное выражение, которое у вас есть, не может быть представлено в виде стандартного глобуса оболочки, поэтому есть смысл его использовать. Хотя, поскольку это было помечено с помощью , мы можем сделать это в оболочке, либо с помощью extglob(, либо используя совпадения регулярных выражений с конструкцией [[.. ]]после более широкого glob ).

shopt -s extglob
for i in "$INPUT_DIR/$INPUT_FILE_PREFIX"[0-9][0-9]@(0[1-9]|1[0-2])@(0[1-9]|[12][0-9]|3[01])"$INPUT_FILE_SUFFIX" ; do

Если вам действительно не нужен такой строгий шаблон, вы можете просто использовать вместо него [0-9][0-9][0-9][0-9][0-9][0-9].

В назначении MYDATEя предполагаю, что вы просто хотите удалить префикс и суффикс. (хотя, если ваш префикс/суффикс содержит строку из шести -цифр, grep также будет соответствовать этому.)

MYDATE=${i#"$INPUT_DIR/"}              # remove the directory
MYDATE=${MYDATE#"$INPUT_FILE_PREFIX"}  # remove the prefix
MYDATE=${MYDATE%"$INPUT_FILE_SUFFIX"}  # and the suffix

Полностью:

shopt -s extglob
for i in "$INPUT_DIR/$INPUT_FILE_PREFIX"[0-9][0-9]@(0[1-9]|1[0-2])@(0[1-9]|[12][0-9]|3[01])"$INPUT_FILE_SUFFIX" ; do
    MYDATE=${i#"$INPUT_DIR/"}              # remove the directory
    MYDATE=${MYDATE#"$INPUT_FILE_PREFIX"}  # remove the prefix
    MYDATE=${MYDATE%"$INPUT_FILE_SUFFIX"}  # and the suffix
    echo "$MYDATE"
done
1
28.01.2020, 02:15

Я бы порекомендовал несколько иной способ циклического перебора имен файлов --с использованием bash расширенной подстановки для сбора имен файлов:

shopt -s extglob
for d in "${INPUT_DIR}"/"${INPUT_FILE_PREFIX}"[0-9][0-9]@(0[1-9]|1[0-9])@(0[1-9]|[12][0-9]|3[01])"${INPUT_FILE_SUFFIX}"
do 
  [[ $d =~ ${INPUT_FILE_PREFIX}([[:digit:]]+)${INPUT_FILE_SUFFIX} ]]
  MYDATE=${BASH_REMATCH[1]}
done

Синтаксис подстановки почти такой же, как у вашего оператора grep. Каждый набор @(...)вводит запрос на соответствие любому из заданных шаблонов, которые разделены |. Я заметил, что (предполагаемый шаблон дня )для [3]был одним классом символов -, поэтому я удалил окружающие его скобки.

Когда у нас есть имена файлов в цикле for, вы можете использовать оператор регулярного выражения =~условного выражения bash, чтобы вырезать цифры в MYDATE.

2
28.01.2020, 02:15

Теги

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