OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

シェルスクリプトについて(POSIX)

  • 暇なときにでも
  • 質問No.152812
  • 閲覧数294
  • ありがとう数3
  • 気になる数0
  • 回答数8
  • コメント数0

お礼率 67% (55/82)

シェルスクリプトを書いていますが、思うように動きません。シェルにお詳しい方がいらっしゃいましたら、ご教授ください。以下のような仕様です。
1.Working dierctoryの中から目的のファイルを検索
2.検出されたファイルの内容を1行ずつ表示させる。
このような簡単な仕様なのですが、awkを使用する必要はありますでしょうか?
シェルは初めてなので勉強不足なため、ここで質問するにあたり、情報が不足していましたら、どうぞ補足してください。宜しくお願い致します。
通報する
  • 回答数8
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル12

ベストアンサー率 67% (310/456)

今までの話の流れで役立ちそうなディレクティブをちょっと紹介。
注:Cシェル系は記述方法が大分違います。

---------------------
#!/bin/sh
for name in *;do
echo $name
done
---------------------
以下 $name はファイル名に当たります。
---------------------
if [ -f $name -a -r $name ];then echo $name;fi
(注:[] は test コマンドです。以下と全く同じ)
test -f $name -a -r $name
---------------------
grep $string $name >/dev/null 2>&1 && echo true || echo false
---------------------
head -$line_number $name | tail -1
---------------------
read input;echo $input
---------------------

さあ,試して,man page引いて,改造してみよう。
特に,grep はモノによって多彩なオプションが使えます。

う,awk使わずに終わるかも。。。
お礼コメント
kiroro302

お礼率 67% (55/82)

onosukeさん、ご回答ありがとうございます。御礼が大変遅くなり申し訳ありません。仕事場の開発環境はそのシェルを使用してもOKなのですが、
個人のPC上でも動作を確認してみたくて、また、B系の構文とC系のものではどのくらい違うものなのか興味もあり、Bashでもかけるかしらと思い、どのシェルでもいいと書いてしまいました。とても参考になります。手元にBシェル系の参考書がなく、man pageで調べて格闘しております。自分なりに改造してみようと思います。エラー処理をどうしようか悩んでおります。
どうもありがとうございました。
投稿日時 - 2001-10-22 16:31:28
-PR-
-PR-

その他の回答 (全7件)

  • 回答No.2

すいませんがもっと詳しく教えていただけないでしょうか。下記イメージでよろしいのでしょうか。 1)directoryにある、特定の文字列を持つファイルを検索する。 特定の文字列はユーザーがkey入力する。 2)ファイルが存在した場合は、表示したい行番号を入力するかenterのみを入力する。 3)複数ファイルの場合は上記2)が繰り返し(ファイル数分)実行される。  複数ファイルの場合は上記2)でent ...続きを読む
すいませんがもっと詳しく教えていただけないでしょうか。下記イメージでよろしいのでしょうか。
1)directoryにある、特定の文字列を持つファイルを検索する。 特定の文字列はユーザーがkey入力する。
2)ファイルが存在した場合は、表示したい行番号を入力するかenterのみを入力する。
3)複数ファイルの場合は上記2)が繰り返し(ファイル数分)実行される。
 複数ファイルの場合は上記2)でenterされた場合に次ファイルの処理に移る。
補足コメント
kiroro302

お礼率 67% (55/82)

ご回答ありがとうございます。すこし仕様を再検証してみたのですが、ディレクトリ検索の部分は手動でやって(処理をするファイルを最初から指定する)ファイルの中身を、
1.行指定の入力ありでその行のみを表示、Returnを押すとその次の行を表示
 (例えばユーザーが5と入力したら、まず5行目を表示させる)
   
2.行指定の入力なし→Returnで全行一気に表示、
というふうにしたいのですが、いかがでしょうか?
大変恐縮ですがどうかお力をお貸しください。
シェルはできれば標準のkshかCsh(tcshならよりいいです。)がいいのですが、
Bシェルでもかまいません。宜しくお願い致します。
投稿日時 - 2001-10-18 17:37:24


  • 回答No.1
レベル9

ベストアンサー率 54% (39/72)

不明な点 ・shellの種類はなにでしょうか? ・ファイルの検索とは? 検索の方法はなにですか? ファイル名検索の場合複数一致した場合はどうする? ・ファイルの内容を一行づつ表示とは? ユーザになにか入力させる? 一気に表示ではだめですか? この程度の説明がないと非常に答えにくいと思います。 やりたいことがはっきりしないのでなんですが、私はawk使いなのでawk使うような気がする。 ...続きを読む
不明な点

・shellの種類はなにでしょうか?
・ファイルの検索とは? 検索の方法はなにですか? ファイル名検索の場合複数一致した場合はどうする?
・ファイルの内容を一行づつ表示とは? ユーザになにか入力させる? 一気に表示ではだめですか?

この程度の説明がないと非常に答えにくいと思います。
やりたいことがはっきりしないのでなんですが、私はawk使いなのでawk使うような気がする。
補足コメント
kiroro302

お礼率 67% (55/82)

mphさん、ご回答ありがとうございます。
・shell… POSIX
・ファイルの検索…WorkingDirectoryの中に、複数のテキストファイルがありま  す。同じようなファイルがあるため、指定した文字列を含むファイルを検索しま す。複数一致した場合はシェルの引数にファイル名を入れて実行する。以下1行ず つ表示させます.(申し訳ありません.1行ずつという表現は混乱しますね。)
 例えばユーザーに行番号を入力させてその1行を表示させる、もし何も入力されず Returnキーをおしたら、すべての行が一気に表示される、というような動きを実 行させることはできますでしょうか?
投稿日時 - 2001-10-17 18:11:56
  • 回答No.4

Kshですが参考になればと思います。 (moji:ファイル名で検索したい文字です) (number:ファイルの中身で表示したい行の番号です) #!/bin/ksh print -n "INPUT MOJI = " read moji for name in $(ls | grep $moji);do if [[ -f $name ]] ; then print & ...続きを読む
Kshですが参考になればと思います。
(moji:ファイル名で検索したい文字です)
(number:ファイルの中身で表示したい行の番号です)

#!/bin/ksh
print -n "INPUT MOJI = "
read moji
for name in $(ls | grep $moji);do
if [[ -f $name ]] ; then
print "File Name:"$name
print -n "Max Line number ";cat $name | wc -l
print -n "INPUT Line Num = "
read number
if [[ $number != "" ]] ;then
while [[ $number != "" ]] ; do
head -$number $name | tail -1
print -n "INPUT Line Num = "
read number
done
else
cat $name
fi
#
fi
done
お礼コメント
kiroro302

お礼率 67% (55/82)

HIROさん、ご回答ありがとうございます。社内にKシェルに詳しい方がいるのですが、「こういうスマートなプログラムを書けるようになれ!!」といわれました。
No.3のonosukeさんが書いてくださったプログラムと比較するとやはりおなじBシェル系で似通ったところが多いと思いましたが、コマンドなど違いもありますね。
大変勉強になります。参考にさせて頂きます。このシェルを少し自分なりに変更して、まず動作を確認してみようと思います。それから、tcshに書き直してみようかなとも思っております。
本当にありがとうございました。御礼が遅くなりまして申し訳ありませんが
今後も宜しくお願い致します。
投稿日時 - 2001-10-22 16:40:29
  • 回答No.5

>1.行指定の入力ありでその行のみを表示、Returnを押すとその次の行を表示 基本的にはNo4で回答したものでOKと思われます。 行指定の入力の場合にReturnで次の行表示という事ですが、そうするのであれば、何が入力されたときに表示終了させるかが必要になります。 この部分は簡単だと思われますので是非、検討してみてください。 もし駄目でしたら再度補足なりにアップしてください。
>1.行指定の入力ありでその行のみを表示、Returnを押すとその次の行を表示

基本的にはNo4で回答したものでOKと思われます。 行指定の入力の場合にReturnで次の行表示という事ですが、そうするのであれば、何が入力されたときに表示終了させるかが必要になります。 この部分は簡単だと思われますので是非、検討してみてください。 もし駄目でしたら再度補足なりにアップしてください。
  • 回答No.7
レベル9

ベストアンサー率 54% (39/72)

ちょっとやって見ました。 環境はsolarisでbashを使っています。あるhtmlファイルの複数あるディレクトリで文字列 "IPv6" を検索してます。 bash-2.03$ export HOGE=`grep ipv6 * |awk '{FS=":"} /.*/{print $1;}'|sort|uniq`;less `echo ...続きを読む
ちょっとやって見ました。

環境はsolarisでbashを使っています。あるhtmlファイルの複数あるディレクトリで文字列 "IPv6" を検索してます。

bash-2.03$ export HOGE=`grep ipv6 * |awk '{FS=":"} /.*/{print $1;}'|sort|uniq`;less `echo $HOGE`

一度お試しください。
お礼コメント
kiroro302

お礼率 67% (55/82)

mphさん、ご回答ありがとうございます。Bashですね。とても参考になります。私個人の環境がBashなので、いろいろ試してみようと思います。lessのところを少し変更してみようかと思っております。やはり、ユーザーに表示させたい行番号を入力させて、任意の行を表示できると、より操作が楽かなと思いましたので。
アドバイスありがとうございます。やる気でてきました。がんばります。
御礼が遅くなり大変申し訳ありません。また宜しくお願い致します。
投稿日時 - 2001-10-22 16:49:10
  • 回答No.6
レベル9

ベストアンサー率 54% (39/72)

grep 文字列 * してその出力の先頭(ファイル名の部分)をsedやawkで切り出して、sortしてuniqした結果をshell変数にセットして、moreやlessの引数に与えるっていうのが一番簡単な気がします。 moreやlessで気に入らない場合はもう一工夫必要ですね。(perlやexをつかうか?) 一度コマンドラインでやってみて気に入ればshellスクリプトに起こしてみてはいかがでしょうか ...続きを読む
grep 文字列 * してその出力の先頭(ファイル名の部分)をsedやawkで切り出して、sortしてuniqした結果をshell変数にセットして、moreやlessの引数に与えるっていうのが一番簡単な気がします。

moreやlessで気に入らない場合はもう一工夫必要ですね。(perlやexをつかうか?)
一度コマンドラインでやってみて気に入ればshellスクリプトに起こしてみてはいかがでしょうか?
  • 回答No.8
レベル12

ベストアンサー率 67% (310/456)

tcsh(Cシェル系)がよいのなら,POSIXは書かない方が… POSIXなシェルっていうと,BシェルかKシェルですよん(^^;;; (どっちもBシェル系)
tcsh(Cシェル系)がよいのなら,POSIXは書かない方が…

POSIXなシェルっていうと,BシェルかKシェルですよん(^^;;;
(どっちもBシェル系)
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ