Bash: чтение регулярных выражений из файла и их подстановка в sed в качестве переменной - PullRequest
0 голосов
/ 03 января 2019

Я застрял с тем, как sed взаимодействует с переменными.Я читаю список регулярных выражений из файла, а затем подставляю его в SED для маскировки определенной конфиденциальной информации в файле журнала.если я жестко закодировал регулярное выражение, SED работает отлично, однако он работает по-разному при использовании с переменной.

con-list.txt contain below:
(HTTP\/)(.{2})(.*?)(.{2})(group\.com)
(end\sretrieve\sfacility\s)(.{2})(.*?)(.{3})$

Не уверен, что знак доллара для регулярного выражения мешает команде SED.

input="/c/Users/con-list.txt"
inputfiles="/c/Users/test.log"
echo $inputfiles
while IFS= read -r var
do
  #echo "Searching $var"
  count1=`zgrep -E "$var" "$inputfiles" | wc -l`
  if [ ${count1} -ne 0 ] 
  then
    echo "total:${count1} ::: ${var}"
    sed -r -i "s|'[$]var'|'\1\2XXXX\4\5'|g" $inputfiles #this doesnt work
    sed -r -i "s/(HTTP\/)(.{2})(.*?)(.{2})(group\.com)/'\1\2XXXX\4\5'/g"     $inputfiles #This works
    egrep -in "${var}" $inputfiles
  fi
done < "$input"

Мне нужно, чтобы SED принял регулярное выражение как переменную, считанную из файла.Таким образом, я мог автоматизировать маскирование для конфиденциальной информации в журналах.

$ ./zgrep2.sh
/c/Users/test.log
total:4 ::: (HTTP\/)(.{2})(.*?)(.{2})(group\.comp\.com\@GROUP\.COM)
sed: -e expression #1, char 30: invalid reference \5 on `s' command's RHS

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Ваша идея была правильной, но вы забыли оставить регулярное выражение в команде sed, чтобы использовать двойные кавычки для расширения $var.

Также вам не нужно использовать wc -l для подсчета совпадений.Все семейства утилит под grep реализуют флаг -c, который возвращает количество совпадений.Тем не менее, вам даже не нужно считать совпадения, но используйте код возврата команды (если совпадение было найдено или нет) просто как

if zgrep -qE "$var" "$inputfiles" ; then

Предполагая, что для отладки вам может понадобиться счетчикв целях, вы можете продолжить свой подход с изменениями в вашем скрипте, как показано ниже

Обратите внимание, как var интерполируется в подстановке sed, оставляя его развернутым в двойных кавычках и раз развернутым, сохраняя литералзначения с использованием одинарных кавычек.

while IFS= read -r var
do
  count1=$(zgrep -Ec "$var" "$inputfiles")
  if [ "${count1}" -ne 0 ] 
  then
    sed -r -i 's|'"$var"'|\1\2XXXX\4\5|g' "$inputfiles"
    sed -r -i "s/(HTTP\/)(.{2})(.*?)(.{2})(group\.com)/'\1\2XXXX\4\5'/g" "$inputfiles"
    egrep -in "${var}" "$inputfiles"
  fi
done < "$input"
0 голосов
/ 03 января 2019

Вам нужно:

sed -r -i "s/$var"'/\1\2XXXX\4\5/g' $inputfiles

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

РЕДАКТИРОВАТЬ: небольшое изменение в $ var, и я думаю, что это то, что вы хотите:

$ cat ~/tmp/j
Got creds for HTTP/PPCKSAPOD81.group.com
Got creds for HTTP/PPCKSAPOD21.group.com
Got creds for HTTP/PPCKSAPOD91.group.com
Got creds for HTTP/PPCKSWAOD81.group.com
Got creds for HTTP/PPCKSDBOD81.group.com
Got creds for HTTP/PPCKSKAOD81.group.com
$ echo $var
(HTTP\/)(.{2})(.*?)(.{2})(.group\.com)
$ sed -r "s/$var"'/\1\2XXXX\4\5/' ~/tmp/j 
Got creds for HTTP/PPXXXX81.group.com
Got creds for HTTP/PPXXXX21.group.com
Got creds for HTTP/PPXXXX91.group.com
Got creds for HTTP/PPXXXX81.group.com
Got creds for HTTP/PPXXXX81.group.com
Got creds for HTTP/PPXXXX81.group.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...