programing

awk 스크립트에서 셸 변수를 사용하려면 어떻게 해야 합니까?

showcode 2023. 4. 25. 23:49
반응형

awk 스크립트에서 셸 변수를 사용하려면 어떻게 해야 합니까?

외부 셸 변수를 전달하기 위한 몇 가지 방법을 찾았습니다.awk대본이 좀 헷갈리네요'그리고.".

먼저 셸 스크립트를 사용해 보았습니다.

$ v=123test
$ echo $v
123test
$ echo "$v"
123test

그리고 나서 awk를 시도했습니다:

$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123

왜 다른 거죠?

마지막으로 해봤습니다.

$ awk 'BEGIN{print " '$v' "}'
$  123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1:             ^ unexpected newline or end of string 

저는 이것에 대해 혼란스러워요.

#쉘 변수를 가져오는 중입니다.awk여러 가지 방법으로 수행될 수 있습니다.어떤 사람들은 다른 사람들보다 낫습니다.이 정도면 대부분 커버할 수 있을 거예요댓글 남겨주세요. v1.5


사용.-v(가장 좋은 방법, 가장 휴대성이 뛰어납니다.)

를 사용합니다.-v옵션: (P.S. 뒤에 공백을 사용합니다.)-v그렇지 않으면 휴대성이 떨어집니다.예.,awk -v var=것은 아니다.awk -vvar=)

variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two

이 옵션은 대부분과 호환되어야 합니다.awk변수는 에서 사용할 수 있습니다.BEGIN차단할 수도 있습니다.

변수가 여러 개인 경우 다음을 수행합니다.

awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'

경고합니다.에드 모튼이 쓴 것처럼 탈출 시퀀스는 그렇게 해석될 것입니다\t현실이 됩니다tab그리고 아니다\t그게 당신이 찾는 거라면요다음을 사용하여 해결할 수 있습니다.ENVIRON[]또는 다음을 통해 액세스합니다.ARGV[]

추신 세로 막대나 다른 regexp 메타 문자를 구분 기호로 가지고 있다면 다음과 같습니다.|?(이중 탈출을 해야 합니다예: 세 개의 세로 막대가 있습니다.|||된다-F'\\|\\|\\|'. 을(를) 사용할 수도 있습니다.-F"[|][|][|]".

프로그램/기능 여관에서 데이터를 가져오는 예제입니다.awk(여기에 날짜가 사용됩니다.)

awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'

셸 변수의 내용을 regexp로 테스트하는 예:

awk -v var="$variable" '$0 ~ var{print "found it"}'

코드 블록 후 변수입니다.

여기 변수가 있습니다.awk코드입니다. 이 기능은 잘 작동합니다.BEGIN차단합니다.

variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
  • 다중 변수를 추가합니다.

awk '{print a,b,$0}' a="$var1" b="$var2" file

  • 이 방법으로 다른 필드 구분 기호를 설정할 수도 있습니다.FS각 파일에 대해 선택합니다.

awk 'some code' FS=',' file1.txt FS=';' file2.ext

  • 코드 블록 뒤의 변수는 다음에 대해 작동하지 않습니다.BEGIN차단합니다.

echo "input data" | awk 'BEGIN {print var}' var="${variable}"


여기 스트링이요

변수를 추가할 수도 있습니다.awk셸(Bash 포함)에서 다음 문자열을 사용합니다.

awk '{print $0}' <<< "$variable"
test

이것은 다음과 같습니다.

printf '%s' "$variable" | awk '{print $0}'

추신: 이것은 변수를 파일 입력으로 처리합니다.


ENVIRON입력하세요

TrueY가 쓰는 대로 다음을 사용할 수 있습니다.ENVIRON인쇄하기 위해 사용합니다.AWK를 실행하기 전에 변수를 설정하면 다음과 같이 인쇄할 수 있습니다.

X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash

ARGV입력하세요

Steven Penny가 쓰듯이, 당신은 사용할 수 있습니다.ARGV데이터를 awk로 가져옵니다.

v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data

데이터를 BEGIN뿐만 아니라 코드 자체에 넣으려면 다음과 같이 하십시오.

v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test

코드 내 변수: 주의하여 사용하십시오.

이 때 변수를 할 수 있습니다.awk코드지만, 지저분하고 읽기 힘듭니다.Charles Duffy이 버전도 코드 주입의 대상일 수 있습니다.만약 가 변수에 나쁜 것을 추가하면, 그 변수는 '변수'의 일부로 실행됩니다.awk

이것은 코드 내의 변수를 추출하여 작동하므로 변수가 코드 내의 일부가 됩니다.

'만들다'를 만들어 보세요.awk변수를 사용하면 동적으로 변경될 수 있지만 일반 변수에는 사용하지 마십시오.

variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two

다음은 코드 주입의 예입니다.

variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000

이렇게 많은 명령어를 추가할 수 있습니다.awk잘못하다 잘못된 명령으로 충돌시킬 수도 있습니다.유효하지 않은 명령으로 충돌시킬 수도 있습니다.

그러나 이 접근법의 한 가지 유효한 사용법은 기호를 awk에 전달하여 일부 입력(예: 단순 계산기)에 적용하려는 경우입니다.

$ calc() { awk -v x="$1" -v z="$3" 'BEGIN{ print x '"$2"' z }'; }

$ calc 2.7 '+' 3.4
6.1

$ calc 2.7 '*' 3.4
9.18

셸 변수 값으로 채워진 awk 변수를 사용하여 awk가 해석하기 전에 셸 변수를 확장하여 awk 스크립트 텍스트의 일부로 만들어야 합니다(아래 Ed M의 주석 참조).


추가 정보:

큰따옴표를 사용합니다.

변수는 항상 큰따옴표로 묶는 것이 ."$variable"
그렇지 않으면 여러 줄이 긴 단일 줄로 추가됩니다.

예를 들어 다음과 같습니다.

var="Line one
This is line two"

echo $var
Line one This is line two

echo "$var"
Line one
This is line two

큰따옴표 없이 얻을 수 있는 기타 오류는 다음과 같습니다.

variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1:    ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1:    ^ syntax error

또한 작은 따옴표를 사용하여 변수의 값을 확장하지 않습니다.

awk -v var='$variable' 'BEGIN {print var}'
$variable

AWK 및 변수에 대해 자세히 알아봅니다.

FAQ를 읽어 보십시오.

옛날에는 잘 지내던 것 같아요.ENVIRON awk 기본 제공 해시는 전혀 언급되지 않았습니다.사용 예는 다음과 같습니다.

$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt

명령줄 옵션을 전달할 수 있습니다. -v변수 이름(변수 이름)을 합니다.v( )와 값()이 있습니다=환경 변수()의 )입니다"${v}" 다음을 수행합니다.

% awk -vv="${v}" 'BEGIN { print v }'
123test

아니면 좀 더 하게 말씀드리자면 (더 적은 수치로) 표현해 주세요.vs) 다음을 수행합니다.

% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test

ARGV를 사용할 수 있습니다.

v=123test
awk 'BEGIN {print ARGV[1]}' "$v"

본문으로 계속 들어가려면 ARGC를 조정해야 합니다.

awk 'BEGIN {ARGC--} {print ARGV[2], $0}' file "$v"

방금 @Jotne의 "for loop"에 대한 답변을 바꿨습니다.

for i in `seq 11 20`; do host myserver-$i | awk -v i="$i" '{print "myserver-"i" " $4}'; done

로그 파일 행의 시작 부분에 날짜를 삽입해야 했고 다음과 같이 처리됩니다.

DATE=$(date +"%Y-%m-%d")
awk '{ print "'"$DATE"'", $0; }' /path_to_log_file/log_file.log

저장하기 위해 다른 파일로 리디렉션할 수 있습니다.

프로 팁입니다.

매번 모든 내용을 입력할 필요가 없도록 이 기능을 처리하는 기능을 만드는 것이 편리할 수 있습니다.선택한 솔루션을 사용하면 다음을 얻을 수 있습니다.

awk_switch_columns() {
     cat < /dev/stdin | awk -v a="$1" -v b="$2" " { t = \$a; \$a = \$b; \$b = t; print; } "
}

그리고 그걸 사용하세요...

echo 'a b c d' | awk_switch_columns 2 4

Output:
a d c b

언급URL : https://stackoverflow.com/questions/19075671/how-do-i-use-shell-variables-in-an-awk-script 입니다.

반응형