以下のようなファイルがあります。
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
Perlでは(代わりの場所で):
Perl -pi 's/^/prefix/' file
ExモードでVimを使うことができます。
ex -sc '%s/^/prefix/|x' file
%
すべての行を選択
s
name__を置き換える
x
name__保存して閉じます
接頭辞が少し複雑な場合は、単にそれを変数に入れてください。
prefix=path/to/file/
次に、その変数を渡して、awkにそれを処理させます。
awk -v prefix="$prefix" '{print prefix $0}' input_file.txt
あなたがPerlを持っているならば:
Perl -pe 's/^/PREFIX/' input.file
シェルを使う
#!/bin/bash
prefix="something"
file="file"
while read -r line
do
echo "${prefix}$line"
done <$file > newfile
mv newfile $file
Pierrがこの懸念を抱いているとは思いませんが、複数のアラートログを同時に監視し、各行の先頭にそれぞれのログの名前を付けたいので、ファイルのライブ「末尾」からの出力を遅らせないソリューションが必要でした。 。
残念なことに、sed、cutなどは、あまりにも多くのバッファリングをもたらし、私が最新の行を見ることを妨げました。 nl
の-s
オプションを使用するというSteven Pennyの提案は興味深かったし、テストはそれが私に関係している望ましくないバッファリングを導入しなかったことを証明しました。
ただし、不要な行番号を削除したいという願望に関連して、nl
を使用する際に問題がいくつかありました(たとえそれが美観を気にかけなくても、余分な列を使用するのが望ましくない場合がある)。 。まず、数値を削除するために "cut"を使用すると、バッファリングの問題が再発生するため、解決策が破綻します。次に、 " - w1"を使用しても意味がありません。これは行番号を1列に制限しないためです。桁数が増えるにつれて幅が広くなります。
あなたが他の場所でこれを捉えたいのであればそれほど美しくはありませんが、それは私がする必要がなかったことです(すべてはすでにログファイルに書き込まれていました。行番号を失い、私のプレフィックスだけを持つ方法は、キャリッジリターン(CRまたは^ MまたはCtrl-M)で-s
文字列を開始することでした。だから、例えば:
#!/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}
これはmoreutilsからのts
コマンドを使った、とても読みやすいonelinerソリューションです。
$ cat file | ts prefix | tr -d ' '
そしてそれがどのようにして段階的に派生しているか:
# Step 0. create the file
$ cat file
line1
line2
line3
# Step 1. add prefix to the beginning of each line
$ cat file | ts prefix
prefix line1
prefix line2
prefix line3
# Step 2. remove spaces in the middle
$ cat file | ts prefix | tr -d ' '
prefixline1
prefixline2
prefixline3
Edを使う:
ed infile <<'EOE'
,s/^/prefix/
wq
EOE
これは、各行(,
)に対して、行の先頭(^
)をprefix
に置き換えます。 wq
は保存して終了します。
置換文字列にスラッシュが含まれる場合は、代わりにs
に別の区切り文字を使用できます。
ed infile <<'EOE'
,s#^#/opt/workdir/#
wq
EOE
パラメータ展開を防ぐため、here-doc区切り文字EOE
( "end of ed")を引用しました。この例では、引用符で囲まれていなくても動作しますが、edスクリプトに$
がある場合は、驚きを防ぐことをお勧めします。
lam
と呼ばれる標準のunixユーティリティがあり、ラミネートの略です。 lam -s prefix file
はあなたが望むことをするでしょう。私はパイプラインでそれを使用します、例えば:
find -type f -exec lam -s "{}: " "{}" \; | fzf
...これは、すべてのファイルを検索し、各ファイルにexec lamを実行して、各ファイルに独自のファイル名のプレフィックスを付けます。 (そして検索のために出力をfzfに送ります。)
これが この答え からの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