2013-10-30 3 views
-2

텍스트 파일에서 항목을 가져 와서 요구 사항에 따라 처리하는 bash 스크립트를 만들고 싶습니다.텍스트 파일에서 데이터를 입력하고 처리합니다.

각 메일 계정의 마지막 로그인 시간을 확인하려고합니다. 나는 텍스트 파일 email.txt 라인 모든 이메일 주소 줄이 포함되어 있고 아래의 명령을 사용하여 이러한 계정 각각에 대한 마지막 로그인 시간을 확인해야합니다

cat /var/log/maillog | grep '[email protected]' | grep 'Login' | tail -1 > result.txt 

그래서 결과의 Result.txt 안에 것

감사합니다,

+2

그리고 그 명령 줄에는 어떤 문제가 있습니까? –

+0

화면이 보이지 않습니다. 입력 파일이 어떤 모습인지, 출력물을 갖고 싶은지 설명하십시오. – Kent

+2

'cat'의 쓸데없는 사용을 발견했습니다! –

답변

-1

귀하의 질문이 명확하지, 당신이 파일에서 읽기 'mail_address1'에 대한 최종 로그인을 찾아 하시겠습니까?

그렇다면 :

#/bin/bash 
while read mail_address1; 
do; 
# Your command line here 
cat /var/log/maillog | grep $mail_address1 | grep 'Login' | tail -1 >> result.txt 
done; < file_with_email_adddrs 

PS : 나는 파일을 통해 루프에 for i in $(cat file) 스타일의 루프를 사용에 대해 조언을 코멘트에 제안 (매우 유효한 것)을 반영하는 대답을 변경했습니다.

+0

예, 이것이 필요한 것입니다. 감사합니다 – Gopu

+0

당신을 위해 답변 중 하나가 동의로 표시하십시오. – ffledgling

+0

세미콜론을 제외하면 저에게 효과적이었습니다. 현재 로그 파일이 매우 크기 때문에 명령 (cat log)이 너무 오래 걸립니다. 마지막 로그인을 확인하고 있기 때문에 로그 맨 아래에서 'email.txt'패턴을 검색하는 아이디어는 마지막 항목 만 필요합니다. – Gopu

2

나는 이런 식으로 찾고 있다고 생각합니다.

while read email_id ; do grep "$email_id" /var/log/maillog | grep 'Login' >> result.txt ; done < email.txt 
0

대용량 로그 파일 인 반복적 인 스캔 대신 모든 이메일 주소를 병렬로 가져 오려면 다음을 수행하십시오.

grep -f file_with_email_addrs /var/log/maillog 

날씨 이것은 로그 파일의 크기 및 가져 오는 전자 메일 주소의 수에 따라 다릅니다. 작은 로그 파일 또는 소수의 사용자가이 음소거를 렌더링합니다. 그러나 큰 로그 파일과 많은 사용자가이 작업을 첫 걸음으로 내딛을 것입니다. 그러나 추가 처리가 필요합니다.

로그 라인의 형식이나 파일의 로그인의 상대적 분포에 대해 확신 할 수 없으므로 다음 단계는 자세한 정보에 따라 다릅니다.

# If logins are rare? 
grep Login /var/log/maillog | grep -f file_with_email_addrs | sort -u -k <column of email> 

# If user count is small 
grep -f file_with_email_addrs /var/log/maillog | awk '/Login/ {S[$<column of email>] = $0;} END {for (loop in S) {printf("%s\n",S[loop]);}' 
관련 문제