2015-01-14 3 views
0

이것은 내 첫 번째 게시이므로 형식이 아닌 경우이 사실을 알려주세요. (배치 파일 : 로그 파일의 마지막 줄을 읽고 새 파일에 복사합니다.

개선을위한 제안을 환영합니다.) 나는 로그 파일에서 마지막 줄을 읽고 그들을 새 파일로 복사하는 배치 파일을 만들려고하고

.

지금까지 here 마지막 줄을 읽는 방법을 발견했습니다. 위의 코드는 한 번에 하나 개의 파일에 대해 작동

for /f %%i in ('find /v /c "" ^< someFile.txt') do set /a lines=%%i 
set /a startLine=%lines% - 1 
more /e +%startLine% someFile.txt > lastLines.txt 

:

코드는 무언가 같이 될 것입니다. 내가 필요한 것은 알려진 목록의 모든 파일에서 마지막 줄을 읽고이 줄을 새로운 .csv 파일에 추가하는 것입니다.

나는 로그 파일에서 4 번째 항목을 얻기 위해 다음 코드를 사용하고 있지만, 모든 로그 파일의 모든 행 반환 내가 필요하면

for /f %%x in (%list%) do for /f "delims=.txt, tokens=4" %%i in (%%x.txt) do echo %%x, %%i >> output.csv 

모두의 조합의 일종입니다하지만 난 돈을 ' 그것들을 결합하고 완전한 마지막 줄을 .csv 파일에 복사하는 방법을 알고 있습니다.

=== @ 마구 : 고맙습니다. 모든 로그 파일에는 쉼표로 구분 된 정보가있는 1에서> 100 줄까지 가능합니다. 같은 뭔가 :

"LOGON,6-1-2015,12:43:39,USERNAME,HOSTNAME,,,,192.168.209.242,00:21:5A:2E:64:5E" 

4 항목과 마지막 코드는 컴퓨터에 로그인 한 모든 계정의 목록을 가져 오는 데 사용되었다. 이 코드는 % list %에서 검사 한 모든 컴퓨터 로그에 대한 모든 로그온/로그 오프 이벤트 목록을 제공합니다. % list $에는 검사 할 로그 파일의 이름이 모두 있습니다. 이것은 모든 줄을 반환했습니다.

새 배치 파일의 경우 마지막 로그온/로그 오프 항목 만 필요하며 전체 마지막 줄을 원합니다.

그래서 검토해야하는 모든 컴퓨터의 호스트 이름이있는 .txt 파일이 있습니다. 이 .txt 파일은 % list % 변수를 통해 한 줄씩 읽습니다.

모든 로그 파일에서 출력 파일에 복사 된 마지막 줄만 필요합니다.

=== 방금 ​​JosefZ가 제공 한 솔루션을 시도했습니다. 불행히도 이것은 아직 나를 위해 작동하지 않습니다. 마지막 줄은 결과 파일에 복사되지 않습니다. 코드에서 로그에 빈 행이 없기 때문에 가능한 lastlines에 대한 추가 항목을 제거했으며, 결과에서 사용할 수 있도록하려는 호스트 이름에 대한 항목도 추가했습니다. JosefZ의 파일 이름은 다음과 같습니다.

@ECHO OFF >NUL 
@SETLOCAL enableextensions disabledelayedexpansion  
type nul>output.csv  
set "list=_listing.txt" 
for /F "tokens=*" %%x in ('type "%list%"') do (
    set "host=%%~x" 
    for /F "tokens=*" %%G in ('type "%%~x"') do set "lastline=%%G" 
    call :lline 
)  
:endlocal 
@ENDLOCAL 
goto :eof  
:lline  
    set "filename=.\logs\%filename:&=^&%.txt" 
    echo %host%,%lastline%>>output.csv 
goto :eof 

결과 파일에는 호스트 이름 만 표시됩니다. 나는 이걸로 더 많은 퍼즐을 풀 겠지만 모든 팁을 환영합니다!

=== 알았습니다!

@ECHO OFF >NUL 
@SETLOCAL enableextensions disabledelayedexpansion 

type nul>output.csv 

set "list=_listing.txt" 
for /F "tokens=*" %%x in ('type "%list%"') do (
    set filename= :: *empty previous filename* 
    set lastline= :: *empty previous lastline* 
    set "host=%%~x" 
    set "filename=.\logs\%host%.txt" :: *creating the filename from path+hostname+extention* 
    for /F "tokens=*" %%G in ('type "%filename%"') do set "lastline=%%G" 
    call :lline 
) 

:endlocal 
@ENDLOCAL 
goto :eof 

:lline 

    echo %host%,%lastline%>>output.csv 

goto :eof 
+0

목록의 각 파일 이름에 대해 원하는 정보는 무엇입니까? 이 "4 번째 입장"은 무엇입니까? 로그 파일의 각 줄과 마지막 줄 전체에서 "네 번째 항목"을 원하십니까? "delims"는 "구분 기호가."또는 "t"또는 "x"또는 ","또는 "space" "- delims"는 문자열이 아니라 문자 집합임을 의미합니다. 질문을 편집하고 추출 할 데이터를 명시하여 예제 라인을 보여주십시오. – Magoo

답변

0

파일에 후행 빈 줄이있는 경우 줄 번호 매기기를 사용하면 접근이 실패 할 수 있습니다.다행스럽게도 for /F 루프는 빈 줄을 무시 (반복하지 않음)합니다. 이 기능을 사용하는 넣어 보자 : 스크립트에서 다음 관행 사용 : 파일 이름을 _listing.txt 파일 이름 목록 (를 포함하여 전체 경로 및 확장 .txt)를 포함

  • set "list=_listing.txt"에서 ! 수 있도록

    • disabledelayedexpansion를 하나 개의 파일 한 줄에 이름 : dir /b /s *.txt>_listing.txt
    • type nul>files\output.csv에 의해 가지고하는 것은 (옵션) 출력 파일을 비워
    • set "lastline=!!!file empty!!!" 변수 %lastline%를 초기화; 파일 이름에 & 수 있도록 set "lastline="뿐만 아니라
    • call :lline 변수를 처리 할 수 ​​%filename%
    • set "filename=%filename:&=^&%"%lastline%이 될 수

    스크립트는 다음과 같다 :

    @ECHO OFF >NUL 
    @SETLOCAL enableextensions disabledelayedexpansion 
    type nul>files\output.csv 
    
    set "list=_listing.txt" 
    for /F "tokens=*" %%x in ('type "%list%"') do (
        set "filename=%%~x" 
        set "lastline=!!!file empty!!!" 
    
        rem the whole line 
        for /F "tokens=*" %%G in ('type "%%~x"') do set "lastline=%%G" 
    
        rem the fourth token only 
        rem for /F "tokens=4" %%G in ('type "%%~x"') do set "lastline=%%G" 
    
        call :lline 
    ) 
    :endlocal 
    @ENDLOCAL 
    goto :eof 
    
    :lline 
        set "filename=%filename:&=^&%" 
        echo %filename% %lastline% 
        rem >>files\output.csv 
    goto :eof 
    

    샘플 _listing.txt 파일 :

    d:\bat\files\1exclam!ation.txt 
    d:\bat\files\2exc!lam!ation.txt 
    d:\bat\files\11per%cent.txt 
    d:\bat\files\12per%cent%.txt 
    d:\bat\files\17per%Gcent.txt 
    d:\bat\files\18per%%Gcent.txt 
    d:\bat\files\21ampers&nd.txt 
    d:\bat\files\22ampers&&nd.txt 
    

    출력 : 솔직히

    d:\bat>lastlines 
    d:\bat\files\1exclam!ation.txt 0 15.01.2015 1:52:28.48 -15072 20465 
    d:\bat\files\2exc!lam!ation.txt 6 15.01.2015 1:52:28.50 3250 16741 
    d:\bat\files\11per%cent.txt -8 15.01.2015 1:52:28.50 -3692 27910 
    d:\bat\files\12per%cent%.txt !!!file empty!!! 
    d:\bat\files\17per%Gcent.txt 0 15.01.2015 1:52:28.56 14508 12374 
    d:\bat\files\18per%%Gcent.txt 1 15.01.2015 1:52:28.56 30540 26959 
    d:\bat\files\21ampers&nd.txt 15.01.2015 1:22:50.18 
    d:\bat\files\22ampers&&nd.txt 15.01.2015 1:22:50.18 
    

    는 모든 안정기 (아마도) 파일 ​​및 ! 만 파일 이름 & (아마도) 빈 선 후행입니다; 모두 함께 할 수 있습니다

  • +0

    Thanx JosefZ 스크립트를 읽는 것이 내가 필요한 것 같습니다.나는 그것을 밖으로 시도하고 최대한 빨리 – Armand0

    +0

    안녕하세요 JosefZ이 는 그냥 코드를 시도한 결과를 다시 얻을 아직 나를 위해 작동하지 않는 것입니다. 자세한 내용은 원래 질문을 읽어보십시오. – Armand0

    +0

    @ JosefZ - 귀하의 답변은 해결책의 기본이었습니다. 고마워요! – Armand0

    0

    간단한 FOR를 사용하여 FOR/F가 아닌 값 목록을 반복해야합니다. 다음과 같은

    뭔가 작업을해야합니다 : 파일 이름 주위

    @echo off 
    setlocal enableDelayedExpansion 
    >>output.csv (
        for %%F in (
        "file1.log" 
        "file2.log" 
        "file3.log" 
        etc. 
    ) do (
        for /f %%A in ('find /v /c "" <%%F') do set /a skip=%%A-1 
        more +!skip! %%F 
    ) 
    ) 
    

    따옴표는 경우에 당신이 공백 이름을 거기에 도착한다. 파일 이름의이 ! 문자를 포함하는 경우가
    set LIST="file1.log" "file2.log" "file3.log" etc.

    @echo off 
    setlocal enableDelayedExpansion 
    set LIST="file1.log" "file2.log" "file3.log" etc.  
    >>output.csv (
        for %%F in (%LIST%) do (
        for /f %%A in ('find /v /c "" <%%F') do set /a skip=%%A-1 
        more +!skip! %%F 
    ) 
    ) 
    

    같은 것을 보이는 경우

    당신은 당신의 LIST 변수를 사용할 수 있습니다, 당신은 당신의 루프 내 지연 ON 확장과 OFF를 전환해야합니다. 그렇지 않은 경우 %%F이 확장되면 지연된 확장으로 인해 이름이 손상됩니다.

    @echo off 
    setlocal disableDelayedExpansion 
    set LIST="file1.log" "file2.log" "file3.log" etc.  
    >>output.csv (
        for %%F in (%LIST%) do (
        for /f %%A in ('find /v /c "" <%%F') do set /a skip=%%A-1 
        setlocal enableDelayedExpansion 
        more +!skip! %%F 
        endlocal 
    ) 
    ) 
    
    +0

    감사합니다. dbenham. 당신의 솔루션은 제가 파일에있는 동안 모든 파일 이름을 배치 파일에 넣도록합니다. 이것은 추가 작업이지만 다른 해결책이 없을 때 시도해 볼 가치가 있습니다. – Armand0

    +0

    @ Armand0 - 아, 이제 FOR/F를 사용하는 이유를 알 수 있습니다. 각 줄에 파일 경로가 하나만 있으면 FOR/F가 파일과 잘 작동합니다. 그러나 각 파일 경로가 더 큰 줄에 포함되면 구문 분석하는 것보다 복잡 할 수 있습니다. 그것은 모두 파일 형식에 따라 다릅니다. – dbenham

    관련 문제