AWK - wmctrl 출력의 마지막 열에 있는 공백을 처리합니다.

AWK - wmctrl 출력의 마지막 열에 있는 공백을 처리합니다.

첫 번째 연구 프로젝트로, 출력을 다시 포맷하고 싶습니다.제어판Debian 11에서 다음과 같이 설치할 수 있는 명령입니다.

sudo apt install wmctrl

열려 있는 모든 창에 대한 정보를 나열하려면 다음 명령을 실행합니다.

wmctrl -lpG

예제 출력:

0x0120002b  4 7      2    157  3836 2068 my-pc window - AWK - Dealing with spaces in the last column of output from wmctrl - Unix & Linux Stack Exchange — Firefox

위 명령에서 각 열의 의미를 기억할 수 없으므로 AWK를 사용하여 이름/값 쌍으로 분할하고 싶습니다.

wmctrl -lpG | awk '{print "----------------------\nWindow ID: " $1 "\nDesktop Number: " $2 "\nProcess ID: " $3 "\nx-offset: " $4 "\ny-offset: " $5 "\nwidth: " $6 "\nheight: " $7 "\nMachine Name: " $8 "\nWindow Title: " $9}'

예제 출력:

----------------------
Window ID: 0x0120002b
Desktop Number: 4
Process ID: 7
x-offset: 2
y-offset: 134
width: 3836
height: 2068
Machine Name: my-pc
Window Title: window

원하는 출력:

----------------------
Window ID: 0x0120002b
Desktop Number: 4
Process ID: 7
x-offset: 2
y-offset: 134
width: 3836
height: 2068
Machine Name: my-pc
Window Title: window - AWK - Dealing with spaces in the last column of output from wmctrl - Unix & Linux Stack Exchange — Firefox

하지만 어떻게 처리해야 할지 모르겠습니다.아홉번째 칼럼출력 wmctrl -lpG(열 9에 공백이 포함되어 있기 때문). 나는 단지 얻는다.첫번째 단어창 제목전체 창 제목 대신.

이 문제를 해결하는 쉬운 방법이 있나요?

답변1

wmctrl -lpG \
| awk '{
         tmp=$0;
         # remove first 8 fields from tmp
         sub(/^[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ +[^ ]+ /,"",tmp);
         print "----------------------\nWindow ID: " $1 "\nDesktop Number: " $2 "\nProcess ID: " $3 "\nx-offset: " $4 "\ny-offset: " $5 "\nwidth: " $6 "\nheight: " $7 "\nMachine Name: " $8 "\nWindow Title: " tmp
       }'

산출:

----------------------
Window ID: 0x0120002b
Desktop Number: 4
Process ID: 7
x-offset: 2
y-offset: 157
width: 3836
height: 2068
Machine Name: sidekick
Window Title: window - AWK - Dealing with spaces in the last column of output from wmctrl - Unix & Linux Stack Exchange — Firefox

답변2

출력이 wmctrl고정 너비 필드인 것처럼 보이므로 에 대해 GNU awk를 사용할 수 있습니다 FIELDWIDTHS. cat file해당 항목이 없으므로 wmctrl원래 print 문을 유지하세요.

$ wmctrl -lpG |
awk -v FIELDWIDTHS='10 3 2 7 7 7 5 6 *' '
{
    for (i=1;i<=NF;i++) {
        gsub(/^ +| +$/,"",$i)
    }
    print "----------------------\nWindow ID: " $1 "\nDesktop Number: " $2 "\nProcess ID: " $3 "\nx-offset: " $4 "\ny-offset: " $5 "\nwidth: " $6 "\nheight: " $7 "\nMachine Name: " $8 "\nWindow Title: " $9
}'
----------------------
Window ID: 0x0120002b
Desktop Number: 4
Process ID: 7
x-offset: 2
y-offset: 157
width: 3836
height: 2068
Machine Name: my-pc
Window Title: window - AWK - Dealing with spaces in the last column of output from wmctrl - Unix & Linux Stack Exchange — Firefox

또는 awk를 사용하세요.

$ wmctrl -lpG |
awk '
    BEGIN {
        OFS = ": "
        numCols = split("Window ID:Desktop Number:Process ID:x-offset:y-offset:width:height:Machine Name:Window Title",hdr,/:/)
    }
    {
        print "----------------------"
        for (i=1; i<numCols; i++) {
            print hdr[i], $i
        }
        sub("([^ ]+ +){"i-1"}","")
        print hdr[i], $0
    }
'

답변3

이것은 한 가지 가능성입니다.

$ wmctrl -lpG | awk '{
  a="";
  for(i=9; i<=NF; i++) { 
    a = a " " $i
  };
  print "----------------------\nWindow ID: " $1 "\nDesktop Number: " $2 "\nProcess ID: " $3 "\nx-offset: " $4 "\ny-offset: " $5 "\nwidth: " $6 "\nheight: " $7 "\nMachine Name: " $8 "\nWindow Title: " a }'
----------------------
Window ID: 0x04000007
Desktop Number: 0
Process ID: 18952
x-offset: 1367
y-offset: 102
width: 1600
height: 836
Machine Name: pc
Window Title:  ~:bash—Konsole
...

관련 정보