- PR -

文字操作(grep,sed?)

投稿者投稿内容
ネ音
会議室デビュー日: 2004/12/10
投稿数: 17
投稿日時: 2004-12-20 14:14
テキストファイルの文頭に<body>、文末に</body>を付け加え、
また、ある文字"UPDOWN"を検索したら、その行の先頭に<font color="red">を付け、その行の行末に</font>を付け加えたいのですが、どう記述すれば良いでしょうか?
例えば、テキストファイル(access.log)が、
Dec 14 13:52:・・・%LINK-5-CHANGED: Inte・・・ate to administratively down
Dec 14 13:52:1・・・ JST: %LINEPROTO-5-UPDOWN: Li・・・nged state to down
Dec 14 13:52:20 10.・・・
・・・・
の時に
<body>
Dec 14 13:52:・・・%LINK-5-CHANGED: Inte・・・ate to administratively down
<font color="red">Dec 14 13:52:1・・・ JST: %LINEPROTO-5-UPDOWN: Li・・・nged state to down</font>
Dec 14 13:52:20 10.・・・
・・・・
</body>
としたいのですが、如何でしょうか?
ニック
ベテラン
会議室デビュー日: 2004/10/20
投稿数: 60
投稿日時: 2004-12-20 14:58
引用:

ネオさんの書き込み (2004-12-20 14:14) より:
テキストファイルの文頭に<body>、文末に</body>を付け加え、
また、ある文字"UPDOWN"を検索したら、その行の先頭に<font color="red">を付け、その行の行末に</font>を付け加えたいのですが、どう記述すれば良いでしょうか?



はじめまして。
文字列操作ならperlでプログラミングするのが適していると思います。
ネ音
会議室デビュー日: 2004/12/10
投稿数: 17
投稿日時: 2004-12-20 15:25
ニックさん、返答ありがとうございます。
なるほど、perlですか!
拙者、perlとは、これまでご縁が御座いません。
この機会に、含蓄を蓄えたいのも山々ですが、
何とかsedやgrep辺りのコマンドで転がせたらと考えております。
sed でしたら、行の先頭なら^、行末なら$を表すので
その辺りで何とかならないでしょうか?
perlは、時期を見て勉強したいです。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-20 15:31
chmod 755 tagadd.sh
コード:
#!/bin/sh


if [ $# -eq 1 ]; then
echo "<body>" > neo
if [ -f "$1" ]; then
awk '{ print $0 }' $1 | sed 's/^\(..*UPDOWN..*\)$/<font color=\"red\">\1<\/font>/g' >> neo
fi
echo "</body>" >> neo
fi



使い方:

$ ./tagadd.sh access.log
$ vi neo

[ メッセージ編集済み 編集者: コブラ 編集日時 2004-12-20 15:37 ]
非武装エリア
大ベテラン
会議室デビュー日: 2004/03/03
投稿数: 202
お住まい・勤務地: 日本・たこ部屋
投稿日時: 2004-12-20 15:41
sedにこだわるなら、

sed "1 i\<body\>" filename | sed "$ a\<\/body\>"

でも、この手の処理系ならwakあたりが最適かも。。。
っと、既にコブラさんがコメントしているようですね。



非武装エリア
大ベテラン
会議室デビュー日: 2004/03/03
投稿数: 202
お住まい・勤務地: 日本・たこ部屋
投稿日時: 2004-12-20 15:47
いかん、wakでなくawkですね。
awkであれば、awkだけで特定の文字が出た際に内容を変える事も容易にできます。
ヘッダーやフッターについては簡単に実現できますね。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-20 15:51
De-Militarized Areaさん、ここって $[0..9] って消えてしもてうっとおしないですか?
直すの面倒臭いっすよね。
ほろりん
ベテラン
会議室デビュー日: 2004/11/24
投稿数: 98
お住まい・勤務地: あそこ
投稿日時: 2004-12-20 16:07
sedじゃつらいんじゃないかな?
自分もawkだけで書いて見ました。
----file a.aw-----
BEGIN{print "<body>"}
{
if(index($0,"UPDOWN")!=0)
print "<font color=\"red\">" $0 "</font>"
else
print $0
}
END{ print "</body>"}


使い方
$ awk -f a.aw input-file

_________________
おしえて〜。せんせ〜いさ〜ん。


[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-20 16:17 ]
CODEタグを使うとうまくはりつかない。。。orz

[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-20 16:19 ]
perl版(うまい人はもっとうまく書けるでしょうけど)

#!/usr/bin/perl
print "<body>\n";
while (<>) {
if (index($_,/UPDOWN/) != 0) {
chomp; # strip record separator
print "<font color=\"red\">" . $_ . "</font>\n";
} else {
print $_;
}
}
print "</body>";

[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-20 17:20 ]
awk別解

BEGIN{print "<body>"}
/UPDOWN/ { print "<font color=\"red\">" $0 "</font>"}
!/UPDOWN/{ print $0}
END{ print "</body>"}


[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-20 18:16 ]

[ メッセージ編集済み 編集者: ほろりん 編集日時 2004-12-20 18:20 ]

スキルアップ/キャリアアップ(JOB@IT)