2017-09-28 3 views
0

에서 프로그램의 볼륨을 추출 : I 추출 할처리 텍스트 -</p> <pre><code>pactl list sink-inputs </code></pre> <p>에서 출력 예를 들어 볼륨을 추출하는 방법을 찾고 pactl 싱크 입력 출력

Sink Input #67 
     Driver: protocol-native.c 
     Owner Module: 12 
     Client: 32 
     Sink: 0 
     Sample Specification: s16le 2ch 44100Hz 
     Channel Map: front-left,front-right 
     Format: pcm, format.sample_format = "\"s16le\"" format.channels = "2" format.rate = "44100" format.channel_map = "\"front-left,front-right\"" 
     Corked: no 
     Mute: no 
     Volume: front-left: 19661/30%/-31.37 dB, front-right: 19661/30%/-31.37 dB 
       balance 0.00 
     Buffer Latency: 100544 usec 
     Sink Latency: 58938 usec 
     Resample method: n/a 
     Properties: 
       media.name = "'Alerion' by 'Asking Alexandria'" 
       application.name = "Clementine" 
       native-protocol.peer = "UNIX socket client" 
       native-protocol.version = "32" 
       media.role = "music" 
       application.process.id = "16924" 
       application.process.user = "gray" 
       application.process.host = "gray-kubuntu" 
       application.process.binary = "clementine" 
       application.language = "en_US.UTF-8" 
       window.x11.display = ":0" 
       application.process.machine_id = "54f542f950a5492c9c335804e1418e5c" 
       application.process.session_id = "3" 
       application.icon_name = "clementine" 
       module-stream-restore.id = "sink-input-by-media-role:music" 
       media.title = "Alerion" 
       media.artist = "Asking Alexandria"       

을 라인에서

30 

Volume: front-left: 19661/30%/-31.37 dB, front-right: 19661/30%/-31.37 dB 

참고 :이 여러 싱크 입력, 그리고 나는 단지 싱크에서 볼륨 입력 # 67

감사

P.S.를 추출해야 할 수도 있습니다 내 음악 플레이어의 음량을 높이거나 낮추는 스크립트가 필요합니다. 저는 리눅스와 bash에 완전히 새로운 것이므로 문제를 해결할 방법을 찾지 못했습니다.

편집 : 내 AWK 버전

[email protected]:~$ awk -W version 
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan 

compiled limits: 
max NF    32767 
sprintf buffer  2040 
+0

이 커뮤니티에서 조회 한 비슷한 질문으로 어떤 시도를 했습니까? 그러한 예제가 많이 있습니다. – Inian

+0

지난 몇 시간 동안 인터넷 검색을 해왔지만 성공하지 못했습니다. awk, grep 및 일부 다른 사람들은 슬프게도 내가 너무 초보자이기 때문에 이해하기가 너무 어렵습니다. 죄송합니다. 비슷한 질문이 많이 있지만 여전히 해결 방법을 찾지 못했습니다. c –

+1

Ok! 그래서 몇 가지 질문. 출력에 여러 개의 '싱크 입력 # 67'이있을 수 있습니까? '30 '을 추출해야합니까? 'front-left'와'front-right'의 값이 동일합니다. – Inian

답변

2

당신은 표준 텍스트 처리 도구를 사용하여 아주 새로운이기 때문에, 내가 자세한 설명과 답변을 제공 할 것입니다. 앞으로도 사용하십시오.

GNU Awk을 사용하여이 답변을 기반으로합니다. 시스템에 mawk이 설치되어있을 가능성이 높습니다.

pactl list sink-inputs | \ 
    mawk '/Sink Input #67/{f=1; next} f && /Volume:/{ n=split($0,matchGroup,"/"); val=matchGroup[2]; gsub(/^[[:space:]]+/,"",val); gsub(/%/,"",val); print val; f=0}' 

Awk/pattern/{action1; action2} 구를 기반으로 한번에 한 라인을 프로세싱한다. 이 경우 우리는 /Sink Input #67/ 행을 일치시키고 플래그 (f)를 사용하여 다음 줄에 Volume: 문자열의 다음 발생을 표시합니다. 플래그가 설정되지 않으면 다른 싱크 입력의 인스턴스와 일치 할 수 있습니다.

그래서 일단 우리가 선을 일치 시키면 디 리미터 /을 사용하여 선을 분할하고 배열 (matchGroup)에 저장된 두 번째로 일치하는 요소를 가져옵니다. 그런 다음 gsub() 전화를 두 번 한 번 사용하여 앞에있는 공백을 바꾸고 다른 사람을 사용하여 번호 뒤에 % 기호를 제거합니다.