내 파일에 다음 텍스트가 있습니다
/etc/pam.d/systemd-user|S.5....T.
/etc/bluetooth|not owned
/etc/pam.d/crond|S.5....T.
/etc/pam.d/crond|S.5....T.
/var/log/dmesg|.M.......
이후의 텍스트는 |
모두로 변경되거나 .
다음 또는 모두가 혼합됩니다.SM5DLUGT
좀 더 이해하기 쉬운 예를 위해 대신 이것을 사용하고 싶습니다.
.M......=Mode differs includes permissions and file type
SM......=Filesize,Mode differs includes permissions and file type
..5.....=md5 sum differs
각각의 분류는 .
다음과 같습니다
S file Size differs
M Mode differs (includes permissions and file type)
5 MD5 sum differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
awk에서 다음과 같은 작업을 수행하고 싶습니다.
awk '{sub(/S......./,"file size differs")}; {sub(/SM....../,"file size\
differs,mode differes includes permissions and file type")}; \
{sub(/.M....../,"Mode differes includes permissions and file type")}; \
{sub(/..5...../,"MD5 sum differes differs")}; \
{sub(/...D..../,"Devicemajor/minoir number mistmatch")}; \
{sub(/....L.../,"Readlink path mismatch")}; \
{sub(/.....U../,"User ownership differs")}; \
{sub(/......G./,"file size differs")}; {sub(/.......T/,"mTime differs")}; \
{print $0}' /system_files_protection.txt
답변1
나는 당신이 유효성 검사 모드에서 출력을 구문 분석하고 있다고 가정하고 있으므로 rpm
거기에 약간의 조정이 있었습니다(비록 "소유하지 않음" 줄에 대해서는 확실하지 않지만). 실패한 테스트에 대한 "?" 처리 지원아니요하지만 여기에도 포함되어 있습니다.
접근 방식의 주요 문제점은 일반적으로 데이터가 수정될 때 점진적으로 처리하려고 시도해서는 안 되며, 일치하는 문자열의 "."는 수정된 데이터와 일치하는 정규식 와일드카드입니다. 예를 들어, /.M......./
정규식은 " .M.......
", " Mode differs
", " " 등과 일치합니다. (GNU awk에서는 0이 아닌 경우 더 많습니다 MD5 sum
.)IGNORECASE
또 다른 문제는 순열의 수입니다. 이를 모두 프로그래밍 방식으로 일치시키는 것은 비현실적입니다.
코드는 다음과 같이 작동합니다.
- 는 문자 위치이고 는 리터럴 문자인
desc[]
인덱스를 사용하여 메시지 배열을 만듭니다."XY"
X
Y
XY
Y가 X번째 위치에 있는 " "에서 " "로 인덱스를 변환합니다...Y.....
(물론 직접 수행할 수도 있지만 지루하고 오류가 발생하기 쉽습니다).- 각 입력 라인을 읽고 각 인덱스 패턴을 차례로 일치시키고 관련 메시지를 누적합니다.
output[]
output[]
쉼표로 구분된 목록으로 평면화- 각 입력 라인의 결과를 인쇄합니다.
익숙하지 않은 경우 (expression) ? "true" : "false"
여기에서 이 구조를 사용하여 쉼표 또는 복수형 후행 "s"(해당하는 경우)를 삽입(또는 삽입하지 않음)하고 저장 if/else
하고 복사합니다. 는 매직 넘버 문자열이고 9는 매직 넘버입니다( 출력이 실제로 오래되었고 열 9에 "P"가 누락된 경우 "........."
이를 변경할 수 있습니다 ).rpm
" "를 사용하면 각 측면의 패딩에 대한 가변 길이 접두사를 %.*s
선택할 수 있습니다 . 위치 N(1에서 시작)의 경우 N-1 문자를 접두사에 출력하고 일치하는 부분을 출력한 다음 9-N 문자를 접미사에 출력합니다.printf()
"........."
BEGIN {
FS="|"
desc["1S"]="file Size differs"
desc["2M"]="Mode differs (includes permissions and file type)"
desc["35"]="MD5 sum differs"
desc["4D"]="Device major/minor number mismatch"
desc["5L"]="readLink(2) path mismatch"
desc["6U"]="User ownership differs"
desc["7G"]="Group ownership differs"
desc["8T"]="mTime differs"
desc["9P"]="caPabilities differ"
## transform indexes: "4D" -> "...D....." with "D" in the 4th column
for (dd in desc) {
match(dd,/([0-9]+)(.)/,bits)
regex=sprintf("%.*s%s%.*s",bits[1]-1,".........",bits[2],
9-bits[1],"........")
sub(/ differs?/,"",desc[dd])
desc[regex]=desc[dd]; delete desc[dd]
}
}
{
oo=0; out=""
for (regex in desc)
if ($2 ~ regex) output[++oo]=desc[regex]
for (ii=1; ii<=oo; ii++)
out=sprintf("%s%s%s",out, (ii>1)?", ":"", output[ii]);
printf("%s|%s differ%sn",$1,out,(oo==1)?"s":"")
}
이러한 코드는 이와 같은 플래그의 다양한 변형을 처리할 수 있을 만큼 유연합니다.
입력에서 "?"를 처리해야 하는 경우 정규식 코드를 수정하여 " .(M|\?).......
" 대신 " .M.......
" 와 같은 더 복잡한 정규식을 생성한 다음 for (regex in desc)
루프에서 일치 항목을 확인하여 이를 처리할 수도 있습니다.
- 내가 수정한 첫 번째 스크립트 오류는 로그 파일을 처리하는 awk 스크립트였습니다. 조회를 위해 하드코딩된 월 이름 배열이 있습니다.한 달의 이름이 누락되었습니다.. 이것을 발견하는 데 얼마나 오랜 시간이 걸리는지 놀라실 겁니다...