- ベストアンサー
UNIXには直接ファイル操作コマンドありますか?
本当に困ってます(T_T) UNIXのShell Scriptでテキストファイルの一部(何行か)を削除したいです。リダイレクト機能とか使わないで、直接ファイルから削除することはできますか? UNIXって直接ファイル編集するコマンド聞いたことないですが、そういうコマンドありますか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 シェルの中でexにヒアドキュメントで exの編集コマンドを与えれば可能です。 環境がないのでうろ覚えですが、 #!/bin/csh ex ファイル名 <<EOF exの編集コマンドで指定行の削除 :wq EOF EOFはヒアドキュメントです。 あと、「パイプやリダイレクトを使用しないで」 の意味が今ひとつわかりません。 おそらくシェルスクリプトに対して パイプやリダイレクトを使用しないという 意味でしょうか? シェルスクリプト内部での使用もダメというので あればそれはなぜなんでしょう? ちなみに特定の行を削除する処理がほしいので あれば、シェルでなくてもCでちょこちょこと 作ったほうが早い気もしますが・・
その他の回答 (5)
- ham_kamo
- ベストアンサー率55% (659/1197)
#3です。やりたいことはだいたいわかったのですが、正確に把握できないので、補足をお願いします。 1.ログファイル から 別のファイル にログをコピー 2.ログファイルのクリア をやろうとしているが、1.と2.の間に新たにログが書き込まれているかもしれないから、全部をクリアするのでなく、一部を残して削除したい、ということなのでしょうか。 その場合、元のファイルに残す分、というのはどれだけなのでしょう。(言い換えると、どれだけ削除するのでしょうか)
補足
回答ありがとうございます。補足させていただきます。 やりたいこと全部説明するのは、長くなっちゃうので、要は、こういうことできるかお聞きしたいです。 パイプやリダイレクトを使用しないで、直接ファイルの真ん中の一部を削除できるShell Scriptを作りたいです。 # cat text.file //全部で6行で、4つのsuログがあります。 command user time ---------------------- su user1 20040721010101 su user2 20040721010102 su user3 20040721010103 su user4 20040721010108 # delete.sh txt.file 3 # cat text.file command user time ---------------------- su user4 20040721010108 //3~5行が削除されました! パラメータとして与えられた行数を直接ファイルから削除できるdelete.shを作りたいです。
- yunapa
- ベストアンサー率56% (18/32)
テキストファイルを数行削除するだけであれば、viで十分足りると思います。通常/binの下にコマンドがあるのでパスを追加しなくても起動すると思います。使用方法としては、vi ファイル名で起動します。 削除したい行数に移動します。行数へ移動する場合は、行数+大文字のGで移動できます。またファイルをスクロールさせるには、CTRL+FやCTRL+Bで1ページスクロールできます。削除したい行数までカーソルが移動できたら、ddとタイプします。それでカーソル行を削除できます。最後に:wqとタイプするとファイルをセーブできます。
補足
皆さん、いろいろ回答してくれて、ありがとうございます。私の説明不足で、ちょっと言いたいこと伝わっていないようです。 実は、監査ログの取得をやっております。ログファイルから別のファイルにログを取得した後、もとの監査ログファイルから取得した分を削除しないといけないです。毎日スケジュラーが自動にShell Scriptでこういうことやるのです。 その制限は二つあります。まず、もとのログファイルを残さないといけないです。次に、別のファイルにログを取得した後も、ログが取られる場合がありますので、もともとのファイルから全部削除するわけにはいかないです。 ということで、やりたいのは、こういうことです; # cat text 1:line1 2:line2 3:line3 4:line4 # xxxx.sh <----- Is it possible? # cat text 1: line1 2: new line add by other processes こういうことできるshell scriptを作りたいです。いい方法あったら、ぜひ教えていただきたいです。
- ham_kamo
- ベストアンサー率55% (659/1197)
直接ファイルを編集する、というのは、標準コマンドでは聞かないです。普通はパイプやリダイレクトを使ってファイルの処理をします。なぜ使いたくないのでしょうか? 具体的にどういうことをやりたいか(どういう行を削除したいか)を書いていただけると、もう少し具体的なアドバイスが得られると思います。
- solaris9
- ベストアンサー率66% (6/9)
何行か削除するだけなら「vi」コマンドでファイルを開き 削除しては如何でしょう? viの使用方法は下記サイトにありました。参考までに・・・
- potedora
- ベストアンサー率47% (66/140)
ex、awk、sedコマンドで行うのが普通です。
お礼
できました! #!/bin/ksh vi text << EOF 3dd:wq //でも、なぜファイルの二行目から削除されるかわからないけど、viの直接編集とまだちょっと違うね EOF あ、こういうこともできるんだ、知らなかった。ありがとうございます!
補足
回答ありがとうございます。パイプやリダイレクトでどうやって直接ファイルを編集できるかちょっとわからないです。編集しようとするファイルは常に変わりますので、一時ファイルを使ったら(例えば下記)、 # cp file1 file1.tmp # head -2 file1.tmp > file1 cpコマンド実行する間や実行した直後、一時ファイルと元のファイルの間に違いが出る可能性が理論的にあります。なので、直接元のファイルを編集するしかないかなと思うんですが。。。 パイプやリダイレクトで直接ファイルを編集することできますか?これはだめですね。 # head -2 file1 > file1 教えてくれた方法でやってみます!