2013-12-21 1 views
1

bash 명령 대체 기술을 사용하여 하나의 라이너에 awk 변수를 만들 수 있습니까? 여기 제가 시도하고있는 것이지만, 어떤 것이 옳지 않습니다.awk -v는 명령 대체를 허용합니까?

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 1) print "there is a load" }' 

아마도 명령 대체가 Awk를 사용하기 때문입니다 (의심 스럽지만). 어쩌면 그 역시 "초기 - ish"일까요? GNU Awk 3.1.7

답변

1

명령 아무 문제가 없습니다 : 지금까지 당신이 명시 적으로 반대를 지정하지 않으면 AWK는 stdin을 읽을 때, 그 바람직한 방법이 될 것이다. 귀하의 명령은 입력을 기다리고 있으며 그것이 실행되지 않는 유일한 이유입니다! 예를 들어

:

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 0) print "there is a load" }' 
abc     ## I typed. 
there is a load  ## Output. 

그냥 전문가에 의해 제안 명령에 BEGIN 포함! 이

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 0) print "there is a load" }' 
there is a load 
0

마지막 awk 명령에는 입력 파일이 없으므로 해당 스크립트에 대해서만 BEGIN 절을 사용할 수 있습니다. 따라서 다음을 시도해보십시오.

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 1) print "there is a load" }' 
3

왜 여기에 변수를 사용합니까?

$ uptime | awk '$(NF-2) >= 1 { print "there is a load" }' 
there is a load 
+2

당신은 당신의 오타 오류를 수정 할 수 있나요? (NF-2)에는 $ -sign이 없습니다. $ (NF-2) 여야합니다. – alvits

+0

@ user3088572, 감사합니다. 결정된. 죄송합니다. –

+0

+1 당신을 환영합니다. 이제 투표 할 수 있습니다. – alvits

0

:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if (AVG >= 1) print "there is a load" }' 

을뿐만 아니라, 당신이이 같이 쓸 수있다 두 배 AWK를 호출 할 필요가 없습니다

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if (AVG >= 1) print "there is a load" }' 

다른 사람이 언급 한대로 BEGIN 필요합니다 :

awk -v uptime=$(uptime) 'BEGIN{ n=split(uptime,u); AVG=u[n-2]; if (AVG >= 1) print "there is a load" }' 

이상 원하는 것 :

는 감소 될 수있다

uptime | awk '{ AVG=$(NF-2); if (AVG >= 1) print "there is a load" }' 
는 :

uptime | awk '$(NF-2) >= 1 { print "there is a load" }'