필드 중 하나가 사용자 입력과 같은 경우 ASCII 테이블을 필터링하는 다음 스크립트가 있습니다.
ascii () {
arg1=$1
cmd=$(man ascii | awk '/000/,/077/ {print}' | sed '/^$/d')
if [ #$ -eq 0 ]
then
echo "${cmd}"
else
newcmd=$(echo "${cmd}" | awk '{for(i=1;i<NF;i++) if ($i=="${arg1}") {print $0}}')
echo "${newcmd}"
fi
}
말할 필요도 없이 작동하지 않지만 다음과 같은 오류가 발생합니다.
bash: [: missing `]'
그리고 awk 문자열 내에 표시된 색상은 내 쉘 인스턴스에서 모두 보라색이므로 "${arg1}"이 올바르게 해석되지 않은 것으로 가정합니다.
(awk도 달러 기호 구문을 사용하고 함수 인수와 awk 필드를 구별하는 방법을 모르기 때문에 사용자 입력의 첫 번째 인수로 var를 사용하고 있습니다.)
답변1
나는 이것이 당신이 원하는 것일 것이라고 생각하지만 예제 입력이나 예상 출력이 없고 어떤 값이 함수에 인수로 전달될 수 있는지에 대한 아이디어가 없으면 이것은 테스트되지 않은 추측입니다.
ascii() {
man ascii |
awk -v tgt="$1" '
/000/ { f=1 }
f && NF && ((tgt == "") || index(" "$0" "," "tgt" "))
/077/ { f=0 }
'
}
바라보다awk 스크립트에서 쉘 변수를 사용하는 방법awk 스크립트에서 쉘 변수 값을 사용하는 방법에 대한 추가 정보.
man ascii
내 시스템에서는 "ascii 없이 수동 입력"이 출력되므로 이 명령이 시스템에서 어떤 형식으로 출력되는지는 알 수 없지만 awk 스크립트에 대한 입력에서 관심 있는 부분(예: 도표 문자)에 공백이 아닌 공백이 포함되어 있는 경우 그런 다음 대상 문자열과 비교하기 위해 모든 공백을 공백으로 변환하는 것과 유사한 작업을 수행합니다.
ascii() {
man ascii |
awk -v tgt="$1" '
/000/ { f=1 }
{ rec=$0; gsub(/[[:space:]]+/," ",rec) }
f && NF && ((tgt == "") || index(" "rec" "," "tgt" "))
/077/ { f=0 }
'
}
및 설정 시 관련 작업만 수행하면 tgt
보다 효율적으로 작성할 수 있습니다 . 예를 들면 다음과 같습니다.f
NF
ascii() {
man ascii |
awk -v tgt="$1" '
!NF { next }
/000/ { f=1 }
f {
if ( tgt == "" ) {
print
}
else {
rec = $0
gsub(/[[:space:]]+/," ",rec)
if ( index(" "rec" "," "tgt" " ) {
print
}
}
if ( /077/ ) {
f=0
}
}
'
}
그러나 입력 매뉴얼 페이지의 크기를 고려하면 간결함보다는 효율성을 걱정할 가치가 없습니다.