以下のようなファイルがあります。
line1
line2
line3
そして、私は取得したい:
prefixline1
prefixline2
prefixline3
Ruby スクリプトを作成することもできますが、その必要がない方がよいでしょう。
prefix
が含まれます/
。/opt/workdir/
たとえば、パスです。
以下のようなファイルがあります。
line1
line2
line3
そして、私は取得したい:
prefixline1
prefixline2
prefixline3
Ruby スクリプトを作成することもできますが、その必要がない方がよいでしょう。
prefix
が含まれます/
。/opt/workdir/
たとえば、パスです。
# If you want to edit the file in-place
sed -i -e 's/^/prefix/' file
# If you want to create a new file
sed -e 's/^/prefix/' file > file.new
prefix
が含まれている場合/
、 にない他の文字を使用しprefix
たり、 をエスケープしたり/
できるため、sed
コマンドは次のようになります。
's#^#/opt/workdir#'
# or
's/^/\/opt\/workdir/'
awk '$0="prefix"$0' file > new_file
awk では、デフォルトのアクションは'{print $0}'
(つまり、行全体を出力する) であるため、上記は次と同等です。
awk '{print "prefix"$0}' file > new_file
Perl の場合 (インプレース置換):
perl -pi 's/^/prefix/' file
ExモードでVimを使用できます:
ex -sc '%s/^/prefix/|x' file
%
すべての行を選択
s
交換
x
保存して閉じます
プレフィックスが少し複雑な場合は、変数に入れてください。
prefix=path/to/file/
次に、その変数を渡し、awk に処理させます。
awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
シェルの使用:
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
pierr にはこのような懸念はなかったと思いますが、ファイルのライブ「テール」からの出力を遅延させないソリューションが必要でした。複数のアラート ログを同時に監視し、各行にそれぞれのログの名前をプレフィックスとして付けたかったからです。 .
残念ながら、sed、cut などはバッファリングが多すぎて、最新の行を表示できませんでした。-s
のオプションを使用するという Steven Penny の提案nl
は興味深いものでした。テストの結果、私が懸念していた不要なバッファリングが導入されないことが証明されました。
ただし、不要な行番号を削除したいという要望に関連して、 の使用にはいくつかの問題がありましたnl
(その美学を気にしなくても、余分な列を使用することが望ましくない場合があるかもしれません)。まず、「カット」を使用して数値を削除すると、バッファリングの問題が再び発生するため、ソリューションが台無しになります。第二に、「-w1」を使用しても役に立ちません。これは、行番号を単一の列に制限しないためです。桁数が増えると、幅が広くなります。
これを他の場所でキャプチャしたい場合はきれいではありませんが、それはまさに私が行う必要のないことなので (すべてが既にログ ファイルに書き込まれているので、リアルタイムで一度にいくつかを監視したかっただけです)、最高の行番号をなくしてプレフィックスだけにする方法は、-s
文字列をキャリッジ リターン (CR または ^M または Ctrl-M) で開始することでした。たとえば、次のようになります。
#!/bin/ksh
# Monitor the widget, framas, and dweezil
# log files until the operator hits <enter>
# to end monitoring.
PGRP=$$
for LOGFILE in widget framas dweezil
do
(
tail -f $LOGFILE 2>&1 |
nl -s"^M${LOGFILE}> "
) &
sleep 1
done
read KILLEM
kill -- -${PGRP}
この回答sed
のアプローチを使用したまとめた例を次に示します。
$ cat /path/to/some/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
function show_help()
{
IT=$(CAT <<EOF
Usage: PREFIX {FILE}
e.g.
cat /path/to/file | prefix_lines "WOW: "
WOW: some text
WOW: another line
WOW: more text
)
echo "$IT"
exit
}
# Require a prefix
if [ -z "$1" ]
then
show_help
fi
# Check if input is from stdin or a file
FILE=$2
if [ -z "$2" ]
then
# If no stdin exists
if [ -t 0 ]; then
show_help
fi
FILE=/dev/stdin
fi
# Now prefix the output
PREFIX=$1
sed -e "s/^/$PREFIX/" $FILE