18

txt ファイルの最後の 10 行をエコーまたは入力する方法はありますか?

サーバー変更ログ スクリプトを実行して、変更を追跡できるように、管理者に現在行っていることを報告するように求めています。最近何が起こっているかを把握するために、スクリプトに最後の 10 件程度のエントリを表示させようとしています。以下に示すように、最後の行を処理するスクリプトを見つけましたが、最後の 10 行を表示するために何を変更すればよいかわかりません。脚本:

@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (c:\log09.txt) do (
set var=%%a
)
echo !var!

ログファイルの例:

06/02/2009, 12:22,Remote=Workstation-9,Local=,
mdb,bouncing box after updates,CAS-08754,
=================
07/02/2009, 2:38,Remote=,Local=SERVER1,
mdb,just finished ghosting c drive,CAS-08776,
=================
07/02/2009, 3:09,Remote=,Local=SERVER1,
mdb,audit of server,CAS-08776,

何かご意見は?スクリプトはうまく機能します。必要なのは、画面にさらに多くの行をパイプすることだけです。

4

10 に答える 10

18

うまくいけば、これがジョエルの目を救うでしょう:)

@echo OFF

:: Get the number of lines in the file
set LINES=0
for /f "delims==" %%I in (data.txt) do (
    set /a LINES=LINES+1
)

:: Print the last 10 lines (suggestion to use more courtsey of dmityugov)
set /a LINES=LINES-10
more +%LINES% < data.txt
于 2009-02-07T15:47:46.933 に答える
12

この回答は、既存の回答の最良の機能を組み合わせて、いくつかのひねりを加えています。

解決策は、tail コマンドの単純なバッチ実装です。

最初の引数はファイル名です (パス情報を含む場合があります。パスの一部にスペースやその他の問題のある文字が含まれている場合は、必ず引用符で囲んでください)。

2 番目の引数は、出力する行数です。

最後に、標準の MORE オプションを追加できます: /E /C /P /S /Tn。(詳細については、MORE /? を参照してください)。

さらに、/N (一時停止なし) オプションを指定すると、出力を一時停止せずに連続して印刷できます。

このソリューションでは、最初に FIND を使用して行数をすばやくカウントします。ファイルは、ファイル名引数を使用する代わりに、リダイレクトされた入力を介して渡され、FIND 出力でのファイル名の出力を排除します。

スキップする行数は SET /A で計算されますが、0 未満の場合は数が 0 にリセットされます。

最後に、不要な行をスキップした後、MORE を使用して目的の行を出力します。出力がファイルにリダイレクトされるか、別のコマンドにパイプされない限り、MORE は各画面分の行の後に一時停止します。/N オプションは、すべての行に一致する正規表現を使用して、MORE 出力を FINDSTR にパイプすることで一時停止を回避します。FIND は長い行を切り詰めることができるため、FIND の代わりに FINDSTR を使用することが重要です。

:: tail.bat File Num [/N|/E|/C|/P|/S|/Tn]...
::
::   Prints the last Num lines of text file File.
::
::   The output will pause after filling the screen unless the /N option
::   is specified
::
::   The standard MORE options /E /C /P /S /Tn can be specified.
::   See MORE /? for more information
::
@echo OFF
setlocal
set file=%1
set "cnt=%~2"
shift /1
shift /1
set "options="
set "noPause="
:parseOptions
if "%~1" neq "" (
  if /i "%~1" equ "/N" (set noPause=^| findstr "^") else set options=%options% %~1
  shift /1
  goto :parseOptions
)
for /f %%N in ('find /c /v "" ^<%file%') do set skip=%%N
set /a "skip-=%cnt%"
if %skip% lss 0 set skip=0
more +%skip% %options% %file% %noPause%
于 2012-02-12T19:32:57.737 に答える
10

の適切な実装を見つける必要がありtailます。しかし、本当に CMD バッチ ファイルを使用することを強く主張し、妨害されていない任意の NT マシンで実行したい場合は、次のようにします。

@echo off
setLocal EnableDelayedExpansion
for /f "tokens=* delims= " %%a in (c:\tmp\foo.txt) do (
set var9=!var8!
set var8=!var7!
set var7=!var6!
set var6=!var5!
set var5=!var4!
set var4=!var3!
set var3=!var2!
set var2=!var1!
set var1=!var!
set var=%%a
)
echo !var9!
echo !var8!
echo !var7!
echo !var6!
echo !var5!
echo !var4!
echo !var3!
echo !var2!
echo !var1!
echo !var!
于 2009-02-07T06:30:21.740 に答える
4

tail コマンドのいくつかの Windows 実装があります。それはまさにあなたが望むものでなければなりません。

これは特に良いですね: http://malektips.com/xp_dos_0001.html

それらは、リアルタイムの監視からファイルの最後の x 行までの範囲です。

編集:含まれているリンクがパッケージへのリンクであることに気付きました。動作するはずですが、さらにいくつかのバージョンがあります:

http://www.lostinthebox.com/viewtopic.php?f=5&t=3801 http://sourceforge.net/projects/tailforwin32

于 2009-02-07T05:11:42.257 に答える
4

このページで見つけたすべての回答を試した後、15539行の私のファイルではどれも機能しませんでした。

ただし、ここでの答えはうまく機能することがわかりました。便宜上、この投稿にコピーしました。

@echo off
for /f %%i in ('find /v /c "" ^< C:\path\to\textfile.txt') do set /a lines=%%i
set /a startLine=%lines% - 10
more /e +%startLine% C:\path\to\textfile.txt

このコードは、「C:\path\to\textfile.txt」ファイルの最後の 10 行を出力します。

クレジットはOP @Peter Mortensenに送られます

于 2015-08-14T19:17:07.500 に答える
4

ファイルが大きすぎる場合、行数を取得するのに時間がかかりすぎる可能性があります 別の方法は、検索を使用して、どこにもない文字列を渡すことです

$find /v /c "%%$%!" yourtextfile.txt

これにより、次のような出力が得られます

$---------- yourtextfile.txt: 140

次に、このように for を使用して出力を解析できます

$for /f "tokens=3" %i in ('find /v /c "%%$%!" tt.txt') do set countoflines=%i

次に、合計行から10行を差し引くことができます

于 2009-03-16T23:14:58.783 に答える
3

単一のpowershellコマンドを使用:

powershell -nologo "& "Get-Content -Path c:\logFile.log -Tail 10"

powershell 3.0 以降に適用されます

于 2015-03-18T13:26:33.093 に答える
1

「TAILを使用する必要があります」という回答に同意します。ただし、Windows ではデフォルトでは付属していません。「 Windows 2003 リソース キット」をダウンロードすることをお勧めします。XP/W2003 などで動作します。

サーバーにインストールしたくない場合は、リソース キットを別のマシンにインストールし、TAIL.EXE のみをサーバーにコピーできます。使い方はとても簡単です。

C:\> TAIL -10 myfile.txt
于 2012-11-23T15:52:40.280 に答える
1

これは、指定された範囲内のファイルの行を表示できる、純粋なバッチで書かれたユーティリティです。最後の行を表示するには (ここでは、スクリプトの名前は tailhead.bat です):

call tailhead.bat -file "file.txt" -begin -10
于 2016-01-20T22:13:58.983 に答える
0

txt ファイルの最後の 10 行をエコーまたは入力する方法はありますか?

次の 3 ライナー スクリプトは、入力ファイルの最後の n 行を一覧表示します。n とファイル名/パスが入力引数として渡されます。

# Script last.txt
var str file, content ; var int n, count
cat $file > $content ; set count = { len -e $content } - $n
stex -e ("["+makestr(int($count))) $content

スクリプトはバイタースクリプトです。使用するには、 http: //www.biterscripting.com から biterscripting をダウンロードし、このスクリプトを C:\Scripts\last.txt として保存し、biterscripting を開始して、次のコマンドを入力します。

script last.txt file("c:\log09.txt") n(10)

上記は、ファイル c:\log09.txt の最後の 10 行を一覧表示します。同じファイルの最後の 20 行を一覧表示するには、次のコマンドを使用します。

script last.txt file("c:\log09.txt") n(20)

別のファイル C:\folder1\somefile.log から最後の 30 行を一覧表示するには、次のコマンドを使用します。

script last.txt file("C:\folder1\somefile.log") n(30)

かなり一般的な方法でスクリプトを作成したので、さまざまな方法で使用できます。別のスクリプト/バッチ言語に自由に翻訳してください。

于 2009-07-13T20:15:11.290 に答える