Как использовать SED или AWK вместо GREP, поскольку он занимает много времени в сценарии оболочки

En primer lugar, el error que está recibiendo se debe a que algún script está intentando ejecutar mysql sin contraseña como root :o usted es root o está usandosudo:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

Suponiendo que su usuario root de MySQL tenga contraseñas, necesitará acceder o interactuar con la CLI de MySQL como :mysql -u username -py la contraseña se solicitarán a continuación.

Una solución fácil (pero no recomendada )sería eliminar la contraseña de MySQL para root, realizar toda la instalación y luego volver -a establecer la contraseña. Esto permitirá que el script de instalación se complete correctamente.

La forma correcta de arreglar esto sería ubicar manualmente el comando CREATE DATABASEen el script de instalación y ejecutarlo manualmente usando la sintaxis del comando mysqlarriba (usando el nombre de usuario y la contraseña ).

crear el almacenamiento de configuración

  1. vaya a las muestras de phpMyAdmin:cd ${installation_path}/phpmyadmin/examples
  2. Importe la muestra:# mysql -u root -p < create_tables.sql(esto ejecutará el script que está fallando en su instalación y solicitará la contraseña)
  3. Reiniciar NGINX:# systemctl restart nginx

Fuentehttp://howtolamp.com/lamp/phpmyadmin/4.2/installing#configuration-storage

Además, el documento de phpmyadmin establece pasos específicos para Debian, que supongo que serán similares a Raspbian:https://docs.phpmyadmin.net/en/latest/setup.html#linked-tables

-1
24.05.2019, 13:31
2 ответа

Решение здесь состоит в том, чтобы использовать встроенные команды в оболочке, так как тогда не будет выполняться несколько fork/exec на строку, что относительно очень дорого.

Я бы сделал так:

#! /bin/bash
echo -n "Enter the logfilename : "
read logfilename
echo "Entered name : $logfilename"
echo "outside the while loop"
let success=0
let failure=0
let total=0
failedtests=()

while read line; do
        case "$line" in
                *Begin\ of\ *)  echo $line
                                failedtests+=( ${line/Begin of /} )
                                ;;
                *PASSED*)       ((success++));;
                *FAILED*)       ((failure++));;
                *End\ of\ *)    ((total++));;
        esac
done < "$logfilename"

echo "Total testcases : $total"
echo "Total testcase with Success : $success"
echo "Total testcase with Failure : $failure"
echo "Failed tests:" ${failedtests[@]}

Вы можете использовать caseдля сопоставления шаблонов глобусов. Согласно вашему примеру данных (, у которых есть «Пройдено», а не «ПРОШЛО», для которых вы выполняете поиск ), начальный *каждого шаблона может быть опущен, однако с ним он точно соответствует использованию grep.

Я также покончил с переменной DONE, так как вы бесполезно перебираете в цикле последнюю пустую строку (, полученную в результате конца -файла -).

РЕДАКТИРОВАТЬ :Добавлен сбор и отображение неудачных тестов. Они собраны в массиве bash failedtests. ${line/Begin of /}приводит к содержимому lineс удаленной строкой.Наконец, полное содержимое массива отображается с помощью ${failedtests[@]}.

2
28.01.2020, 05:07

Вы можете использовать следующий сценарий, если ваш AWK поддерживает переменную IGNORECASEдля принудительного сравнения без учета регистра. (GNU AWK, например. в Linux поддерживает это.)

Если ваш AWK не поддерживает IGNORECASE, вы можете

  • изменить все шаблоны соответствия на нечувствительные к регистру шаблоны, например. /[Pp][Aa][Ss][Ss][Ee][Dd]/вместо /passed/и т. д. или
  • используйте функцию tolowerсо значением, которое необходимо сопоставить, например. tolower($0) ~ /passed/вместо /passed/и т. д.
awk 'BEGIN { IGNORECASE=1; }
/^begin of / { print; count=1; passed=failed=0;}
/^end of / { count=0; totalcount++; if(failed)failcount++;else if(passed)passcount++;}
/passed/ && count { passed=1; }
/failed/ && count { failed=1; }
END {
  print "Total testcases : " totalcount;
  print "Total testcase with Success : " passcount;
  print "Total testcase with Failure : " failcount; }' logfile

С помощью этого ввода (в файлеlogfile)

Begin of A_HL_INT_GPRS_CGDSCONT_0000
Passed
foo
End of A_HL_INT_GPRS_CGDSCONT_0000
Begin of A_HL_INT_GPRS_CGDCONT_0002
bar
passed
FAILED
End of A_HL_INT_GPRS_CGDCONT_0002
Begin of foo
failed
End of bar
foo
Passed
FAILED
bar

Я получаю такой результат

Begin of A_HL_INT_GPRS_CGDSCONT_0000
Begin of A_HL_INT_GPRS_CGDCONT_0002
Begin of foo
Total testcases : 3
Total testcase with Success : 1
Total testcase with Failure : 2

Примечания:
Отредактированная версия скрипта считает passedили failedтолько один раз между строками begin of...и end of..., failedимеет приоритет над passed.
Сценарий не проверяет совпадение идентификаторов в begin of...и end of....

2
28.01.2020, 05:07

Теги

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