Что означает "_="?

После проверки вы можете напрямую выводить цветной текст в терминал, используя awk . В приведенном вами примере вы можете создать файл сценария awk (например, displayLog.awk ), содержащий следующий код:

# output INFO lines in cyan
$3 == "INFO" {
    print "\033[36m"$0"\033[0m"
    next
}

# don't display DBG lines
$3 == "DBG" {
    next
}

# output WARNING lines in bright yellow
$3 == "WARNING" {
    print "\033[1;33m"$0"\033[0m"
    next
}

# output ERROR lines in bright red
$3 == "ERROR" {
    print "\033[1;31m"$0"\033[0m"
    next
}

# If you want to skip all other lines, comment next line
{print}

Затем откройте чистое окно терминала, убедитесь, что отображение неограничено (вы можете отобразить все 6000 строк сразу) и используйте его следующим образом:

$ awk -f displayLog.awk log.txt

OR Как пользователь jlliagre предложил в своем решении, перенаправьте его в необработанный режим less :

$ awk -f displayLog.awk log.txt | less -R

Это должно сработать Хитрость ! Вы можете поиграть с цветами и тем, какие строки вы хотите отображать, основываясь на примере кода awk в моем ответе. Подробнее о цветовом кодировании здесь .

РЕДАКТИРОВАТЬ

Если вы хотите, чтобы было окрашено только одно слово, а не целая строка (например, вы хотите, чтобы ОШИБКА была только красной), сделайте следующее:

$3 == "ERROR" {
    $3 = "\033[1;31m"$3"\033[0m"
    print
    next
}

29
11.10.2017, 04:30
3 ответа

_=в начале строки в выводе простого набора означает, что в bash есть переменная с именем_(подчеркивание ). И его значение равно тому, что следует за =. Например, установка переменной с именем test_varна 12345даст (в bash):

$ test_var=12345

$ set | grep test_var
test_var=12345

$ declare -p test_var
test_var=12345

Эта специальная переменная bash будет установлена ​​в последний аргумент предыдущей строки:

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ echo "$_"
_=myvar=hello

$ echo "Testing some" "values" "in the shell" "(only bash)" "_=myvar=hello"
Testing some values in the shell (only bash) _=myvar=hello

$ declare -p _
declare -- _="_=myvar=hello"

Обратите внимание на два=в этом выводе.


Подробное описание

При выполнении set -a var=99, происходят три различных события (, связанные с вашим вопросом):

  1. Установите параметр(-a)(в обратном порядке, выполнивset +a)для экспорта переменных.
  2. Позиционные параметры «устанавливаются» в соответствии с параметрами ($1, установленными наvar=99).
  3. Подчеркивание переменной оболочки $_установлено в последний параметр (, расширенный ).

установить -a

Выполнение set -aпомечает все последующие (новые или измененные )переменные как экспортированные (во всех оболочках, кроме cshи некоторых родственных оболочках ).

$ set -a
$ myvariable=wer
$ env | grep myvariable
myvariable=wer

Чтобы вернуться к этой настройке, просто измените -на +:

.
$ set +a
$ unset myvariable              # to erase it from the environment if it
                                # was exported before the change of set +a
$ myvariable=456544654          # A new value of the variable.
$ env | grep "variable"         # No output means the var does not exist
                                # in the current environment

установить переменную=99

Что на самом деле должно быть set -- var=99, чтобы избежать интерпретации опции (и set has lot )со значениями, начинающимися с тире(-).

Устанавливает список аргументов (список позиционных параметров )на то, что после --. Это справедливо для всех разумных оболочек (, но не для csh и др. ). Позиционные аргументы печатаются с "$@" (или аналогичным "$ *", не равным ).

$ set -- a=1 b=2 c=3
$ echo "$@"
a=1 b=2 c=3

#_=последний _аргумент И значение внутренней переменной оболочки _изменится на последний аргумент исполняемой строки. Это НЕ верно почти для всех оболочек (jsh, ash, yash, dash, lksh, mksh, ksh93,attsh и, конечно же, csh и tcsh ), кроме bash.

$ echo one two last argument
one two last argument

$ echo "$_"
argument

$ echo This is a new: last_argument
This is a new: last_argument

$ echo "$_"
last_argument

Обратите внимание, что значение в $_— это значение после расширения :

.
$ a="A New_Argument"
$ echo Something else to test: "$a"
Something else to test: A New_Argument

$ echo "$_"
A New_Argument

Вот почему при выполнении:

$ set -a myvar=99; set | grep 'myvar'
_=myvar=99

Вы получаете описание переменной оболочки '$ _'. Это тоже работает:

$  set -a myvar=99; declare -p _
declare -- _="myvar=99"
19
27.01.2020, 19:38

Символ подчеркивания на самом деле является специальной переменной оболочки. Здесь вы видите переменную подчеркивания(_)со значением var=99. Он доступен только для чтения и поддерживается оболочкой. Это:

  • Устанавливается при запуске оболочки и содержит абсолютное имя файла оболочки или исполняемого сценария, переданное в списке аргументов.
  • После этого он расширяется до последнего аргумента предыдущей команды после раскрытия.
  • При проверке почты этот параметр содержит имя почтового файла.
  • Также устанавливается полное имя пути каждой команды, выполняемой и помещаемой в среду, экспортированную в эту команду.

Ваш пример относится ко второй категории. Вы набрали:

set -a var=99  

Таким образом, последний аргумент был var=99, и это было значение , которое вы устанавливали (вы не устанавливали varв99). Следовательно, _было установлено на это. Об этом сообщается :

.
_=var=99  

Это немного сбивает с толку, но первое =указывает на присваивание переменной _, а второе является частью значения.

Также стоит упомянуть, что опция -aдля setприведет к экспорту всех последовательно определенных переменных .

39
27.01.2020, 19:38

Правильный ответ зависит от используемой вами оболочки:

  • вместо bash, применимо все, что сказал @BobEager
  • для zsh, устанавливается только последний аргумент предыдущей команды и полный путь к команде в среде команды
  • некоторые оболочки, такие как dash, устанавливают эту переменную только при запуске интерактивного сеанса

В других оболочках могут быть и другие особенности. Таким образом, $_является не определенным в POSIX, поэтому при его использовании следует помнить о потенциальных проблемах с переносимостью.

Примечание :Если вы намерены присвоить значение 99 для varи сделать его доступным в среде последующих подпроцессов, правильный синтаксис для достижения этого:

export var=99
16
27.01.2020, 19:38

Теги

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