편집-bash
$1
변수를 사용하지 않습니다 . 예 필드 지정자를 사용 :$1
,$2
,$3
있습니다awk
입력 레코드 필드가 불행하게도 내가 너무 빨리 예를했고, 혼합 업 예.
나는 이것이 일반적인 문제라고 생각합니다. awk
데모 도구로 사용 하고 있습니다. 목표는 ( awk
) 스크립트 매개 변수를 awk
(또는 모든 도구) 명령에 삽입하는 것입니다.
우리는 awk
결과를 생성하기 위해 STDIN에서 제공되는 필드를 사용합니다 . 식별자는 $1
, $2
, $3
있는 awk
표준 입력 스트림으로부터 필드.
원하는 솔루션 A (선호 개념), 다음과 같습니다.
#!/bin/bash -f
# script: blue.sh
#
awk -e '{ print $1 " and " $2 " silly example" ;}'
#
그리고 원하는 출력 :
$ echo "red blue yellow" > ./blue.sh
red and blue silly example
$
Alternaitve B는 다음과 같이 생각할 수 있습니다.
#!/bin/bash -f
# script: green.sh
#
wrk="awk -e '{ print \$3 \" and \" \$2 \" variable example\" ;}' "
#
echo "work is:"
echo $wrk
echo
$wrk
그리고 원하는 출력 :
$ echo "red blue yellow" > ./green.sh
wrk is:
awk -e '{ print $3 " and " $2 " variable example" ;}'
yellow and blue variable example
$
문제는 -e
표현 에 대한 인용에 있습니다.
이러한 사례 중 하나를 달성 할 수있는 수단이 있습니까?
해결책을 찾았지만 초기 비전과는 상당히 다른 것으로 밝혀졌습니다. bash
명령에서 -script 변수 를 확장하는 방법을 찾을 수 없으므로 '구성'해야합니다. 이 설정 아웃이 xargs
몇 가지 이유가 쉘이 그 일을하고 싶었 방법으로 할 수 있도록 unsuitanble했다.
예제 실행과 코드를 제시하고 어떻게 / 무슨 일이 일어나는지 설명하겠습니다. "# (2)"와 같은 레이블로 대화 할 영역을 표시했습니다.
예 :
입력 ...
$ svn status -qu ..
M 28637 /src/line.h
M 28637 /src/line.cpp
* 28637 /testing/CheckWindows.py
처리 중 ...
반복 스크립트는 두 가지 매개 변수를 사용합니다.
awk
입력 스트림을 필터링하는 몇 가지 명령명령 줄 :
svn status -qu .. | repeat \
'cp -v $ff /mnt/testhost/testarea/r02/$ff' \
"{ if( $1 == "M" ){ print $3; } }"
출력 ...
'/src/line.h' -> '/mnt/testhost/testarea/r02/src/line.h'
'/src/line.cpp' -> '/mnt/testhost/testarea/r02/src/line.cpp'
무슨 일 이야?
r02/testarea
repeat
입력에서 필터링 된 목록에 대한 일련의 명령을 반복하는 것입니다.주석이 달린 코드 :
#!/bin/bash
# repeat.bash
function repeat
{
local -a actions=()
local DELIMITER=";"
local filter="${2}"
local cmd=""
local wrk="${1}${DELIMITER}" # (1) Template
local str=""
while [[ $wrk ]] # (2) Split-up individual commands
do
str="${wrk%%"${DELIMITER}"*}"
actions+=( "${str}" )
wrk="${wrk#*"${DELIMITER}"}"
done
echo "actions: " # (3) Debugging code
for action in "${actions[@]}"
do
echo " => \"${action}\"."
done
echo "filter => '${filter}'."
ex="${filter}" # (4) Awk instructions to
# process input stream
for ff in $(awk -e "${ex}") # (5) .
do
for action in "${actions[@]}" # (6) .
do
cmd="${action//\$\{ff\}/${ff}}" # (7) .
cmd="${cmd//\$ff/${ff}}"
${cmd} # (8) .
done
done
return
}
repeat "${@:1}" # (9) .
참고 :
$1
는 명령 템플릿입니다. $1
일반적으로 둘 이상의 명령입니다. 입력 인수를 개별 세미콜론으로 구분 된 명령 문자열로 분할합니다.ex
변수에 필터를로드합니다 . ex
전달 된 필터 만 $2
있습니다.ex
는 awk
선택 / 생성 필터로 실행할 명령 이됩니다 .action
명령 템플릿을 반복합니다 .$ff
과 확장 합니다.${ff}
action
$ff
..그것이 뿌려 졌을 때 이것은 awk
또는 템플릿 문자열에 인자를 직접 주입하는 것이 가능하지 않았기 때문에 상당히 달라졌습니다 . 그러나 해결 방법은 너무 불편하지 않으며 비밀 확장 등없이 모든 것이 어떻게 작동하는지 보여줍니다.
이 아이디어가 유용하다고 믿습니다. 이제 작업 스 니펫이 생겼으므로 매우 편리합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다