출력을 변수에 저장하고 재사용

출력을 변수에 저장하고 재사용
page=`grep $x /var/www/vhosts/example.com/statistics/logs/access_log | awk '{print $7}'| sort |uniq -c |sort -nr`
times=`$page | wc -l`

grep의 출력을 변수에 page.

하지만 grep 출력을 재사용하여 다른 것을 계산하고 싶습니다.

아래 코드는 다음을 발생시킵니다.

command not found

문제를 해결하고 출력을 재사용하는 방법은 무엇입니까?

답변1

page변수에는 임의의 텍스트가 포함될 수 있으므로을(를) 사용하면 안 됩니다 echo. 을(를) 사용해야 합니다.printf.

times="$(printf %s\\n "$page" | wc -l)"

또한 명령 출력에 후행 개행 문자가 여러 개 있는 경우 grep어쨌든 예상한 결과를 얻을 수 없습니다.명령 대체는 후행 줄 바꿈을 제거합니다.echo내가 사용한 명령이나 이와 printf유사한 명령은 정확히 추가됩니다하나grep변수를 설정할 때 출력에서 ​​제거되는 개행 수 에 관계없이 후행 개행입니다 .$page


물론 이 경우에도 변수 의 정보가 출력되는 방식 $times이므로 변수의 시작 부분에 추가 공백이 많이 있을 것입니다 . wc -l따라서 이 답변은 스크립트의 더 넓은 문제를 해결하지 않습니다. 더 나은 서비스를 제공하려는 것 같습니다 bash.awk

변수를 어떻게 처리하려는지에 따라 제가 틀렸을 수도 있지만 $times심각하게 의심스럽습니다. 아마도 필요한 것을 할 수 있을 것입니다(모두필요한 것)을 awk한 문장으로 표현합니다.

답변2

고쳐 쓰다:여러 줄의 $page 값 수정, @Wildcard에게 감사드립니다!

2호선에 아주 가깝습니다. 1번 라인이 작동하는 한, 2번 라인에서는 다음을 시도해야 합니다.

times="$(echo "$page" | wc -l)"

설명하다

  • $(백틱( 여기서 호출됨 ) )을 사용하는 것과 동일한 명령 대체이지만 코드 에서 더 쉽게 찾을 수 있기 때문에 선호합니다.man bashbackquotes$( )
  • 단순한 소유만으로는 $page아무것도 전달되지 않습니다.wc -l
  • $page대신 Bash는 사용자가 명령으로 작성한 모든 것을 실행하고 해당 명령의 출력을 에 전달한다고 생각하므로 포함된 wc -l경우 명령이라고 생각할 것입니다 . 이로 인해 볼 때 발견되는 것과 같은 오류가 발생할 수 있습니다.$page5 bla5 blacommand not found
  • 따라서 값을 전달하기 위해 echo변수를 사용할 수 있습니다.$page
  • 그러나 $page여러 행의 값을 포함 하면 echo $page기본값으로 인해 행이 손실되고 공백이 됩니다.
  • $page이러한 바람직하지 않은 결과를 방지하려면 값과 새 줄을 따옴표로 묶어 보존하세요.echo "$page"

따라서 를 이용하면 echo "$page"정확하게 wc -l$page을 받을 수 있게 됩니다.

관련 정보