첫 번째 연구 프로젝트로앗, 출력을 다시 포맷하고 싶습니다.제어판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
...