내 구성 파일에 다음 줄이 있습니다.
bindsym $mod+F2 exec gnome-terminal #Open terminal
bindsym $mod+p exec command /some/path" #Popup Dictionary
bindsym $mod+Mod1+l exec --no-startup-id /some/path/command #Dmenu for my books collection
bindsym Mod1+Control+b exec rxvt -e nnn #nnn file browser
awk
두 번째 열도 나열 #
하고 싶습니다 awk
.
awk '/bindsym/{print $2}' filename
그것을 얻는 방법을 잘 모르겠습니다 #
.
선호하는 출력은 키 뒤에 주석 텍스트가 오는 것입니다.
$mod+F2 Open terminal
답변1
$ awk -v OFS='\t' '/^bindsym/ { key = $2; sub(".*#", ""); print key, $0 }' file
$mod+F2 Open terminal
$mod+p Popup Dictionary
$mod+Mod1+l Dmenu for my books collection
Mod1+Control+b nnn file browser
awk
이는 먼저 각 행의 두 번째 필드를 bindsym
변수 로 추출하는 데 사용됩니다 key
. 그런 다음 #
해당 줄(해당 줄 포함) 앞의 모든 항목을 삭제 하고 key
탭을 구분 기호로 사용하여 줄의 나머지 부분을 인쇄합니다.
대체 출력 형식:
$ awk '/^bindsym/ { key = $2; sub(".*#", ""); printf("%-20s\t%-20s\n", key, $0) }' file
$mod+F2 Open terminal
$mod+p Popup Dictionary
$mod+Mod1+l Dmenu for my books collection
Mod1+Control+b nnn file browser
논리는 동일하지만 출력에서는 두 개의(왼쪽 정렬) 필드 각각에 20자를 할당하고 그 사이에 탭 문자를 배치합니다(좋은 측정을 위해).
답변2
GNU 기능을 활용하여 줄부터 줄 match()
끝까지 일치시킵니다.awk
#
awk '/bindsym/ && match($0,/#(.+)$/,arr){print $2, arr[1]}' filep
이 match()
함수는 두 번째 매개변수의 정규 표현식과 일치하는 패턴으로 세 번째 매개변수에 제공된 배열을 채웁니다.
모든 POSIX에서 awk
의 세 번째 매개변수는 match()
다음과 같습니다.아니요지원되지만 표시하는 RSTART
몇 가지 특수 변수가 있음RLENGTH
시작그리고길이일치하는 그룹. substr()
일치하는 문자열을 얻기 위해 현재 줄에서 이 함수를 사용합니다 .
awk '/bindsym/ && match($0,/#(.+)$/){print $2, substr($0,RSTART+1,RLENGTH)}' file
printf()
출력을 예쁘게 인쇄하려면 다른 답변의 기능을 사용할 수 있습니다 .
답변3
이는 수행하기 쉽습니다 sed
. 데이터가 실제로 필드 지향적이지 않기 때문에 awk는 여기서 큰 이점을 제공하지 않습니다.
sed 's/^[^ ]* //;s/ .*#//' inputfile
번역하다:
s/^[^ ]* //
첫 번째 공백 문자 앞의 모든 항목을 제거합니다.
s/ .*#//
줄의 첫 번째(나머지) 공백 문자부터 마지막 문자까지 #
모든 항목을 제거합니다.
답변4
Step1: count=`awk '{print NR}'|sed -n '$p' filename`
Step2:for ((i=1;i<=$count;i++)); do awk -v i="$i" 'NR==i && $0 ~ /^bindsym/{print $2}' filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g"
output
for ((i=1;i<=$count;i++)); do awk -v i="$i" 'NR==i && $0 ~ /^bindsym/{print $2}' filename; sed -n ""$i"s/.*#//p" filename; done| sed "N;s/\n/ /g"
$mod+F2 Open terminal
$mod+p Popup Dictionary
$mod+Mod1+l Dmenu for my books collection
Mod1+Control+b nnn file browser