awk를 사용하여 열 헤더를 일치시키고 열 값을 인쇄합니다.

awk를 사용하여 열 헤더를 일치시키고 열 값을 인쇄합니다.

또는 명령을 free사용하여 열을 인쇄하는 방법은 무엇입니까 ?awksed

vmstat버전 열에 따라 free5번 열에서 다른 열로 변경될 수 있습니다.

bash-3.00$ vmstat 1 1|tail -2
r b w swap free re mf pi po fr de sr s0 s1 s3 -- in sy cs us sy id
0 0 0 38018936 24998752 122 182 33 81 53 0 0 5 7 -0 0 4113 8416 4527 1 0 99
bash-3.00$ vmstat 1 1|tail -2|awk '{print $5}'
free
24998752

답변1

입력의 첫 번째 줄에서는 모든 필드를 반복하여 string 과 같은 필드를 찾습니다 free. 이 필드 번호를 기억한 다음 이를 사용하여 해당 필드만 출력합니다.

awk 'NR==1 { for (i=1;i<=NF;++i) if ($i=="free") { n=i; break }} { print $n }'

이로 NR==1인해 다음 블록은 첫 번째 행(즉, 헤더 행)에 대해서만 실행됩니다. 이 변수는 n필드의 필드 번호를 보유합니다 free.

제공한 데이터에 대해 테스트합니다 vmstat 1 1|tail -2(여기에 있는 파일에서 읽기 file).

$ awk 'NR==1 { for (i=1;i<=NF;++i) if ($i=="free") { n=i; break }} { print $n }' file
free
24998752

내 원래 답변은 FNR대신 을 사용합니다 NR. 불행하게도 awk해당 변수는 SunOS에서 사용할 수 없지만 FNR이 경우 NR다른 항목을 변경하지 않고 사용할 수 있습니다.

vmstat또한 일부 시스템의 출력에는 free열이 다음과 같이 표시 됩니다 fre(예: OpenBSD). 이것은 당신을 의미합니다가능한$i ~ "^fre"대신 사용하고 싶습니다 $i == "free".

답변2

csvcut다음 도구를 사용하세요 .csvkit:

vmstat 1 1 | tail -2 | tr -s ' ' | csvcut -d ' ' -c free

또는

vmstat 1 1 | tail -2 | csvcut -d ' ' -S -c free

답변3

나는 다음 방법으로 그것을했다

for ((i=1;i<=10;i++)); do free -mh| awk -v i="$i" '$i=="free"{x=NR+2}(NR<=x) {print $i}'; done


output
for ((i=1;i<=10;i++)); do free -mh| awk -v i="$i" '$i=="free"{x=NR+2}(NR<=x) {print $i}'; done
free
859M
0B
praveen@praveen:~$ 

답변4

이것은: vmstat 1 1 | sed -e 's/ +/ /g' | tail -2

또는 다음과 같습니다: vmstat 1 1 | tail -2 | tr -s ' ' |

관련 정보