다음과 같은 긴 로그를 출력하는 명령(logcat)이 있습니다.
07-27 09:26:22.416 17574 17886 D SurfaceControl: Excessive delay in setPowerMode()
07-27 09:26:22.421 17574 17599 I PowerManagerService: Sleeping (uid 1000)...
07-27 09:26:22.427 17489 17527 D audio_hw_primary: adev_set_parameters: enter: screen_state=off
형식은 다음과 같습니다.[Date] [Time] [Process ID] [Thread ID] [Log Type] [Text]
프로세스 ID가 아닌 프로세스 이름(더 정확하게는 패키지)을 보고 싶습니다.
패키지 이름은 다음을 사용하여 프로세스 ID로 검색할 수 있습니다.
echo "$PKG_PID_LIST" | grep -w $PID | cut -d ' ' -f1
예를 들어:
$ echo "$PKG_PID_LIST" | grep -w 17489 | cut -d ' ' -f1
org.lineageos.audiofx
궁금하시다면 예, 저는 Android를 사용하고 있으며 다음을 사용하여 목록을 만들고 있습니다.
PKG_PID_LIST=$(eval $(pm list packages | cut -d ':' -f 2 | sed 's/^\(.*\)$/echo \"\$\(echo \1\) \$\(pidof \1\)\";/'))
최종 출력은 다음과 같아야 합니다.
07-27 09:26:22.416 com.android.systemui 17886 D SurfaceControl: Excessive delay in setPowerMode()
07-27 09:26:22.421 com.android.systemui 17599 I PowerManagerService: Sleeping (uid 1000)...
07-27 09:26:22.427 org.lineageos.audiofx 17527 D audio_hw_primary: adev_set_parameters: enter: screen_state=off
편집: $PKG_PID_LIST에 대한 출력 예:
$ echo "$PKG_PID_LIST"
com.android.deskclock 18937
com.android.systemui 17574
net.osmand.srtmPlugin.paid
com.android.bluetoothmidiservice
org.lineageos.audiofx 17489
(실행되지 않는 패키지에는 PID가 없습니다. 패키지 이름 뒤에는 항상 공백이 있습니다.)
답변1
여러 입력 소스에서 읽고 필요에 따라 사용자 정의 작업을 적용하면 awk
됩니다.
awk 'FNR==NR{pidMap[$2]=$1; next}$3 in pidMap{$3=pidMap[$3]}1' <(echo "$PKG_PID_LIST") <(logcat)
이는 내부적으로 명령을 실행하고 명령의 출력을 파일에 나타난 것처럼 표시하는 <()
쉘에서 제공하는 구문입니다 . bash
두 번째 파일 내용으로 출력이 logcat
여기에 표시되도록 합니다. 그래서awk
노력하다두 개의 입력 스트림에서 읽습니다.
여러 입력 스트림을 동시에 읽을 때 사용되는 논리입니다. FNR==NR
각 파일의 줄 번호와 전체 입력 스트림을 추적하는 데 사용되는 특수 변수입니다. 따라서 조건의 경우 기본적으로 첫 번째 파일에서 실행되는 다음 작업과 두 번째 파일에서 실행되는 다음 작업을 정의합니다.awk
FNR
NR
FNR==NR
{..}
그래서 처음에는문서스트림과 마찬가지로 출력을 보고 PKG_PID_LIST
키가 프로세스 ID이고 프로세스 이름이 값인 해시 맵을 생성합니다. 이 파일을 처리한 후에는 모든 PID를 해당 이름에 매핑했습니다.
두 번째 파일에서는 이 맵 $3 in pidMap
의미를 사용합니다. 두 번째 스트림의 값은 $3
방금 처리한 키로 존재하고 $3
두 번째 스트림($3
세 번째 공백으로 구분된 열)의 값을 키 값의 맵으로 업데이트합니다. . 이는 수정 사항을 기반으로 행을 다시 작성하도록 지시하는 {..}1
작업입니다 awk
(또는 수정 사항이 없으면 행을 인쇄합니다).
logcat
지속적으로 출력을 생성하고 출력이 결정된 후 이 명령을 실행하려는 경우 먼저 출력을 임시 파일에 쓴 다음 전달하는 것이 좋습니다.저것.awk
답변2
다음을 수행할 수 있습니다.
logcat |\
_PKG4PID_="$PKG_PID_LIST" \
perl -lpe '
%h = reverse split /\s+/, $ENV{_PKG4PID_} if $. == 1;
s/(?:\H+\h+){2}\K(\H+)/$h{$1}/;
'
설명하다:
- 환경 변수를
_PKG4PID_
쉘 변수와 동일하게 설정하십시오PKG_PID_LIST
. - 입력 읽기의 첫 번째 줄에서는
perl
키를 두 번째 필드로, 값을 첫 번째 필드로 사용하여 해시가 초기화됩니다.%h
- 이제 현재 행에서 세 번째 필드를 찾아
/(?:\H+\h+){2}\K(\H+)/
해당하는 해시 항목으로 바꾸세요$h{$1}
.