Обработка логов скрипта bash и комментариев в текстовом файле - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь прочитать текстовый файл, который имеет несколько комментариев, начинается с «#», мой bash-скрипт должен читать строки текстового файла, который не начинается с «#». Также я пытаюсь захватить вывод операторов echo в обоих журналах и показать это окно консоли для понимания пользователя.

Я попытался использовать приведенный ниже запрос для захвата журналов и печати в консоли

exec 2> & 1 1 >> $ logfile

Для чтения каждой строки файла ивызывая функцию, я объявил массив и для удаления строк, начинающихся с '#', я использовал следующий запрос.

declare -a cmd_array 
while read -r -a cmd_array | grep -vE '^(\s*$|#)' 
do
  "${cmd_array[@]}" 
done < "$text_file"

Примечание: мне нужно удалить строку, начинающуюся с '#' иостальные строки для чтения и размещения в массиве, как объявлено.

Bash script 
***********

#! /bin/bash

Function_1()
{
now=$( date '+%Y%m%d%H%M' )
eval logfile="$1"_"$now".log
exec 2>&1 1>>$logfile     ### Capture echo output in log and printing in console 
#exec 3>&1 1>>$logfile 2>&1
echo " "
echo "############################"
echo "Function execution Begins"
echo "############################"
echo "Log file got created with file name as $1.log"
eval number=$1
eval  path=$2
echo "number= $number"
ls -lR $path >> temp.txt
        if [ $? -eq 0 ]; then
        echo " Above query executed."
        else
        echo "Query execution failed"
        fi
echo "############################"
echo "Function execution Ends"
echo "############################"
echo " "
}

text_file=$1
echo $text_file
declare -a cmd_array  ### declaring a array 
while read -r -a cmd_array | grep -vE '^(\s*$|#)'  ### Read each line in the file with doesnt starts with '#' & keep it in array
do
  "${cmd_array[@]}" 
done < "$text_file"


Text file 
*********
####################################    
#Test
#Line2
####################################
Function_1 '125' '' ''
Function_1 '123' '' ''

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Я протестировал с входным файлом inputfile

echo a
Function_1 '125' '' ''
# skip me
Function_1 '123' '' ''
echo b

и написал этот скрипт:

declare -a cmd_array  ### declaring a array
while read -r -a cmd_array
do
  echo "${cmd_array[@]}"
  "${cmd_array[@]}"
  echo
done < <(grep -vE '^(\s*$|#)' inputfile)

Для отображения вывода в журнале и консоли см. https://unix.stackexchange.com/a/145654/57293

Как @GordonDavisson предложил в комментарии, вы получите симулированный результат с

source inputfile

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

Еще одним преимуществом источника ввода является обработка многострочного ввода и # в строках:

Function_1 '123' 'this is the second parameter, the third will be on the next line' \
     'third parameter for the Function_1 call'
echo "This echo continues
on the next line."
echo "Don't delete # comments in a string"
Function_1 '124' 'Parameter with #, interesting!' ''
0 голосов
/ 04 октября 2019

Подумайте о передаче вывода grep в чтение:

declare -a cmd_array  ### declaring a array 
    ### Read each line in the file with doesnt starts with '#' & keep it in array
grep -vE '^(\s*$|#)' < "$text_file" | while read -r -a cmd_array
do
  "${cmd_array[@]}" 
done

Я не совсем уверен насчет вывода / записи в журнале. Если вам нужен вывод, добавленный к файлу, в дополнение к stdout / console), рассмотрите возможность использования 'tee' (вероятно, 'tee -a')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...