- ベストアンサー
/dev/stdinはそれ以降の入力をかき消す???
意味不明なタイトルですみません。 今回は/dev/stdinについて教えてください。 /dev中のファイルは特殊ファイルなので深追いしない方がいいとは思うのですが詳しい方お願いします。 次のコマンドとその出力を見てください。 $ echo "a > a > a > a > a" | while read LINE > do > grep -l str $LINE > done a a a a a $ これはgrepにファイルaを5回検索させる命令ですが この5行のaの途中に/dev/stdinを挿入すると次のように/dev/stdin以降が出力されなくなってしまうのです!! $ echo "a > /dev/stdin > a > a > a > a" | while read LINE > do > grep -l str $LINE > done a $ この/dev/stdinとはいったい何者なのですか!? このコマンドでは、いったいどのような事態が起こっているのですか!?
- みんなの回答 (3)
- 専門家の回答
関連するQ&A
- /dev/stdin
/dev/stdin/ の利用価値を教えてください。 いまいちありがたみがわからないのです。 cat /dev/stdin と入れてみて、「a」と入力すると同じ文字が次の行で表示されました。 #cat /dev/stdin a ←自分で入力 a ←自動で表示された。 ★実行プログラムが標準入力や標準出力に対応していなくでもファイル名を指定するときに これらのファイルを指定することで、標準入出力に対応できます。 パイプやヒアドキュメントをつかって便利に使えるようになりますよ。 というblog記事も見つかったのですが いまいち、ピンと来ないのです。 /dev/stdin を使うとどんなメリットがあるのでしょうか ご教授お願いします。
- ベストアンサー
- Linux系OS
- duコマンド+アルファで大きなファイルを検索
以下のコマンドでディスク内の大きなファイルを検索することはできるのですが、ディレクトリも検索されてしまう為、ファイルかどうか判断するのは自分で見なければなりません。 --------------------------------------------------------------- du -a `ls -la /| egrep -wv "backup|^l[rwx-]+|skel|\.|\.\.|^total|proc" | awk '{print $NF}'` | sort -nr | head -30 出力された内容がディレクトリなら偽として、大きなファイルだけをしりたいのです。 一度ファイルに出力してからwhileを使って一行ずつifコマンドでディレクトリなら偽として出力していけばできるのですが。 ------------------------------------------------------------------ while read line ;do if [ -f "$line" ] ; then echo "$line" ; fi ; done < list これと同じ結果をファイルを作成せずにやりたいのです。 while分の最後のdoneにファイルをリダイレクトさせる要領で while read line ;do if [ -f "$line" ] ; then echo "$line" ; fi ; done < `printf "$list\n"` としてもうまくゆきません。 どうしたらファイルを作成せずにディスク内の大きなファイルだけを検索する事ができますでしょうか。
- ベストアンサー
- Linux系OS
- 【シェル】whileコマンドについて
【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- Kシェルのreadコマンドについての質問。
Kシェルのreadコマンドについての質問。 簡単なサンプルですが、以下のように動作させたいのですが、 readコマンドが無視(動作しない)されております。 while read line do echo $line read ans <--- 実行しても入力を求められない状況です。 echo $ans done < ./xxx 何かご存知でしたら、ご教授下さい。 宜しくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- (UNIX)後ろのスペース出力について
UNIXのコマンドで、catで読み込んだ行をwhile文でファイルに出力しているのですが、その際に後ろのスペースを消さずに出力するにはどうすれば良いのでしょうか? 以下のような処理を行っています。 cat $infile | read LINE do echo "$LINE" >> $outfile done <$infileの内容> 1 10 100□□□□□□ 2 20 200□□□□□□ ・・・ 以上となります。よろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
- Perlについて
あるテキストファイルからディレクトリだけを抜き出して各ディレクトリにパーミッションをつけたいのですがやりかたはシェルスクリプトでやろうとかんがえています。 #!/usr/bin/bash while read x1 x2 x3 x4 x5 x6 x7 x8 x9 ; do echo $x1 | grep ^d > /dev/null 2>&1 if(($?==0));then echo mkdir -p $x9 fi done < file.txt とディレクトリを作るところからパーミッションはどう書けばわかりません。当方初心者なのでわからないことがおおいです。 ご教授お願いします。 ~
- 締切済み
- Perl
- シェルスクリプトとコマンドライン
iptablesログからSRC=10.10.10.10の通信ログを取得しようとしました。 見よう見まねで下記コマンドラインを作成しました。 【コマンドワンライナー】 for ((i=1;i<9;i++));do da="2013012"$i;logfile=iptables.log-$da.gz ; echo -n $ logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l;done 2>/dev/null このとき、所々に「;」を入力しました。 なぜ、;(セミコロン)をそこで入れる必要があったのかが分からないのです。 多分シェルスクリプトで記述した時の 「改行の位置?」ではないかと思っているのですが この認識で間違っていないでしょうか? 【シェル記述 改行の位置で;(セミコロン?)】 #!/bin/sh for ((i=1;i<9;i++)) do da="2013012"$i logfile=iptables.log-$da.gz echo -n $logfile':';zcat $logfile | grep SRC=10.10.10.10 |wc -l done 2>/dev/null ご教授お願いします。
- ベストアンサー
- Linux系OS
- 全角空白が間に挟まれているキーワードで検索
どこかに書いてあったことを参考にしたのですが、 $ find /tmp -type f > find.txt ; cat find.txt | while read LINE ; do echo grep -l \"This\\s*program\" \"$LINE\" >> grep_script.sh ; done によりできあがったスクリプト grep_script.sh を走らせることで、その中の一行一行で grep -l "This\s*program" /tmp/sample.txt こういう感じのコマンドが実行され、 半角空白が間に挟まれている「This program」を検索できますが、 全角空白が間に挟まれている「This program」を検索するにはどうすればいいでしょうか? 全角スペースの文字コード 0x81,0x40 を使えばいいのかな、とは思ったのですがやり方が分かりません。 どのようにすればいいでしょうか? よろしくお願いします。
- ベストアンサー
- Linux系OS
- シェルスクリプトでファイルの読みとり
/etc/ldap.confからpam_passwordで始まる行を見つけてその行を書き換えて上書きする関数を作ろうとしているところです。 以下のようにしましたがデバッグのためのechoでの出力が見えませんでした。 echoで1行ずつ列挙されるのを確認したいのですがどうしたらよいですか? function func1 { while read LINE ; do echo $LINE done < $1 return "" } buf=`func /etc/ldap.conf`
- 締切済み
- Linux系OS
- UNIXのshでの入力受付について
またまたシェル関係で質問です。 sh上で入力受付をさせたいときは通常 「read 変数名」 をいれて入力受付をさせています。 ですが、今やっている現象でこの入力受付が スルーされているという現象が起きていて悩んでいます。 ※ ソース例 ls -l | while read VAL_A ; do echo "test" read VAL_B ← ここで入力受付がスルーされる done そこで質問なのですが、read以外にキー入力受付を 実現できるコマンドというものは存在するのでしょうか? もしなければ、回避方法は存在するのでしょうか? ちなみに実行環境は OS:HP-UX11.0 となっています。それでは宜しくお願いします。
- ベストアンサー
- その他(OS)
補足
Leanさん、ご返信ありがとうございます。 助言いただいたとおりに操作してみました。 まず、grepコマンドの前にecho "grep -l str $LINE"を入れてみました。 $ echo "a > /dev/stdin > a > a > a > a" | while read LINE > do > echo "grep -l str $LINE" > grep -l str $LINE > done grep -l str a a grep -l str /dev/stdin $ 1回目のループではecho、grepともに予想通りの出力です。 2回目のechoも予想通りです。 2回目のgrepは何も出力しません。 これは/dev/stdinに文字列strがないことを物語っています。 そして処理は終了します。 whileは入力行がある限り繰り返すはずなのにここで終了してしまうということは、 実はすでに最終行まで入力が終了しているということ?? これだけでは、よく分からないので、 次にgrep -l str $LINEをcat $LINEに変更してみました。 $ echo "a > /dev/stdin > a > a > a > a" | while read LINE > do > echo "grep -l str $LINE" > cat $LINE > done grep -l str a str grep -l str /dev/stdin a a a a $ 1回目のループではecho、catともに予想通りの出力です。 2回目のechoも予想通りです。 2回目のcatの出力は"a a a a"でしょうか 2回目のcatとはすなわち cat /dev/stdin であるため、 /dev/stdinの内容は"a a a a"であるといえます。 そして3回目のループは実行されない。 それは2回目のループまでで、全ての入力行が終了してしまうからということでしょうか。 整理します。 /dev/stdinとは標準入力のこと。 そして、ここでいう標準入力は"a /dev/stdin a a a a"です。 しかし/dev/stdinの内容はそれ以降に入力した"a a a a"となっていました。 そして、入力したはずの"a a a a"はかき消されていて、 かき消された内容は/dev/stdinの内容と一致する!? うーん頭が混乱してきましたが、自分なりに打ち出した見解はこうです。 /dev/stdinは標準入力の内容を保持しているが、絶え間なく更新しているため、 catで中を覗こうとしても、そのタイミングにより、様々な結果が表示される。 また、標準入力は1個しかないので、たとえ仮想的に標準入力を表す/dev/stdinを覗いたとしても、その時点で入力が完了したと判断され、元の入力はかき消されてしまう。 うまく説明できないのですが、こんな感じでしょうか。 今回の例では1回目のループ時点では/dev/stdinの内容は"a /dev/stdin a a a a"でしたが、このとき1行目のaの入力が完了したため/dev/stdinの内容が"a a a a"となり、2行目の入力は/dev/stdinなので全ての入力が一気に渡されwhile自体が終了したということかな・・・。 こう考えれば、つじつまが合う気がするのですが、いかがでしょうか。