이것은 내 명령입니다:
cat httpd.conf | grep ^LogFormat | awk -F\" '{print $(NF)}'
산출:
commonsess
common
또는 값의 개수에는 제한이 없으며 이 값을 배열에 저장하고 인덱스 번호를 사용하여 하나씩 인쇄해야 합니다.
답변1
셸에서 배열이나 루프를 사용하는 것은 일반적으로 코딩 습관이 좋지 않다는 신호입니다. 쉘은 다른 명령을 실행하기 위한 도구입니다. awk
텍스트 레코드의 필드를 사용하여 복잡한 작업을 수행하기 위한 일반적인 명령입니다. awk
수백 개의 명령 루프를 실행하는 대신 작업에 대해 한 번 호출 하고 싶습니다 .
다음으로 시작하는 행의 색인과 마지막 필드 이름을 인쇄하려는 경우 ^LogFormat
:
awk '/^LogFormat/{print n++, $NF}' httpd.conf
cat
(연결을 위해), grep
( awk
yes 의 상위 집합 grep
), 쉘 배열이나 쉘 루프가 필요 하지 않습니다 .
답변2
전략적으로 말하면 cat, grep and awk
일반적으로 사용하는 것이 잘못되었습니다. 당신은 지금
cat /etc/httpd/conf/httpd.conf | grep ^LogLevel | awk -F\" '{print $(NF)}'
배열의 행을 읽으려면 다음을 사용할 수 있습니다.read
while read -rd '' -a array
do array+=("$REPLY")
done < <(awk -F\" '/^LogFormat/{ print $(NF)}' httpd.conf)
printf '%s\n' "${array[0]}"
답변3
요컨대,
다음과 같이 사용할 수 있습니다.
a=( $(awk '/^LogFormat/{print $(NF)}' httpd.conf) )
httpd.conf의 단어를 배열 변수에 넣습니다 a
.
이제 인덱스로 요소에 액세스할 수 있습니다.
$ echo ${a[2]}
common
설명 및 일러스트레이션
아시닌정렬:
$ a=( e1 e2 e3 )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""
count: 3, a[2]: "e2"
일부 껍질설정:
이 예에서는 값으로 단어만 있다는 것을 알고 있으므로 이는 필요하지 않지만 일반적으로 매우 중요합니다. 값에 또는 가 포함된 경우
와일드카드를 방지하는 옵션이 필요합니다 . 또한, 사소하지 않은 경우 데이터를 기반으로 내부 필드 구분자 IFS를 설정하고 저장하고 복원해야 합니다.-f
*
?
$ # set -f
$ # IFS=$'\n'
우리의 테스트입력하다:
$ in=httpd.conf
$ grep '^LogFormat' "$in" | awk -F\" '{print $(NF)}'
combined
common
referer
agent
그리고 당신 것원래주문하다:
$ a=( $(cat "$in" | grep '^LogFormat' | awk -F\" '{print $(NF)}') )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""
count: 4, a[2]: " common"
와 함께더 짧게@StéphaneChazelas의 버전:
$ a=( $(awk '/^LogFormat/{print $(NF)}' $in) )
$ echo "count: ${#a}, a[2]: \"${a[2]}\""
count: 4, a[2]: "common"