ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:シェルでreadの文字数) シェルでreadの文字数制限とは? 2012/02/29 14:49 このQ&Aのポイント Bシェルでreadを使用する際に文字数の制限があるか疑問です。スクリプトを実行すると、長い文字列が切れてしまいます。例えば、最後の値の「0.704073409098534720779」は「0.704073409098534」までしか表示されません。 シェルでreadの文字数 Bシェルでreadを使用する際に取得可能な文字数の制限ってあるのでしょうか。 スクリプト: 下記test.logのset行のみ、4つ目のカラムを0に変更し、 その他の行はそのまま表示させたい。 # cat test.log set test01 0 2222 6 0.83322 set test02 1 3429 7 test002 set test03 0 9872 222 0.704073409098534720779 #!/bin/sh RENAM_F=/tmp/test2.log while read F1 F2 F3 F4 F5 do if [ $F1 = "add" ]; then echo "$F1 $F2 $F3 0 $F5" >>$RENAM_F else echo "$F1" >>$RENAM_F fi done < test.log ============ 上記スクリプトを実行すると、長い文字列は切れてしまいます。 例えば、最後の値の「0.704073409098534720779」は「0.704073409098534」までしか 表示されません。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (3) 専門家の回答 質問者が選んだベストアンサー ベストアンサー kmee ベストアンサー率55% (1857/3366) 2012/02/29 18:18 回答No.1 少なくとも、手許にあるB-sh系(dash,ash,ksh,bash,zsh)で試したところ、全部0.70~は最後まで出力されましたが。 ( if [ $F1 = "add" ]; then のaddがsetの間違いだとして) もっとも、この程度の変換だったらsedで十分。awkでもperlでもone-lineでできること。 while read なんて書き方は、本当に変数に取り込む必要があるときだけにした方がいいと思います。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (2) notnot ベストアンサー率47% (4903/10364) 2012/02/29 21:22 回答No.3 本当に質問通りのスクリプトでそうなりますか? そうなってしまうスクリプトを自分なりに削除して短くしたつもりが、原因を含んだところを削除してしまった物と思います。 もしくは、test2.log の内容の確認方法を間違っているか。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 ky072 ベストアンサー率60% (85/140) 2012/02/29 19:12 回答No.2 No.1 さんの仰る通り、sed や awk で1行ですね。 % sed '/^set/s/[^ ]*/0/4' test.log > test2.log % awk '/^set/{print $1,$2,$3,0,$5;next}{print}' test.log > test2.log 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターOS(技術者向け)Linux系OS 関連するQ&A シェルスクリプト 2月14日頃質問のあった”UNIXのシェルスクリプトを使用してテキストファイルのある列にある特定の文字列を条件としてその行を出力するということをやりたい”を下記のように作ってみました。問題ないか逆質問の形で投稿します。(ルール違反かもしれませんが質問が締め切られているので・・・) #!/bin/bash CAT=YAHOO while read LINE do echo $LINE > tmp.txt DOG=`cut -d" " -f2 tmp.txt` if [ "$CAT" = "$DOG" ] then echo "$LINE" fi done < catalog.file ファイルから文字列を読み込むシェルスクリプトの作成 現在シェルスクリプトの勉強をしています。 ファイルから文字列を読み込み表示するだけのシェルスクリプトを 作成しているのですが、エラーが出てうまくいきません。 ./test.sh: line 10: syntax error near unexpected token `done' 以下の通りファイルを作っています。 改行コードはLF、文字コードはSJISとなっています。 どのあたりが間違っているのか教えて頂けますでしょうか。 よろしくお願いします。 test.sh --------------------- #!/bin/sh LIST=./abc.lst while read F1 echo ${F2} break done < ${LIST} } --------------------- abc.lst --------------------- AAA BBB CCC --------------------- for文で変数に格納される文字列 (Bシェル) シェルの記述に関しての質問です 例えば、 a1 b1 c1 a2 b2 c2 a3 b3 c3 a4 b4 c4 ・ ・ ・ というスペース区切りの配列が書かれたリストファイル(test.lst)を for VAR in `cat test.lst` do set $VAR echo $1 echo $2 echo $3 done という形で処理しようとします。 そうすると、$VAR に入る変数は "a1" や "b1" といった感じで行単位ではなく、スペース区切りで入ってきてしまい、 $2 や $3 はnullになってしまいます。 これを行単位で $VAR という変数に代入する方法はありますか? 区切り文字はスペースのままとします。 宜しくお願いします。 ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム リスナーログをシェルで自動で消す リスナーログをシェルで自動で消したいです。 ただ、ログは一切消失できません。 おおよそ #lisnctl LSNRCTL> set log_file listener.tmp.log # mv listener.log listener.old LSNRCTL> set log_file listener.log # cat listener.old listener.tmp.log > listener_YYYYMMDD.log のようなイメージを考えていますが、 これをシェル化(シェルでなくても自動化) する事は可能でしょうか? Kシェルのreadコマンドについての質問。 Kシェルのreadコマンドについての質問。 簡単なサンプルですが、以下のように動作させたいのですが、 readコマンドが無視(動作しない)されております。 while read line do echo $line read ans <--- 実行しても入力を求められない状況です。 echo $ans done < ./xxx 何かご存知でしたら、ご教授下さい。 宜しくお願い致します。 awk外で宣言した変数の参照 kshを使用して、以下のようなシェルを作成しています。 しかしawk内で$iと$iiが参照出来てない様子です。 どのようにすれば参照できますでしょうか。 ■シェルの中身 #/usr/bin/ksh for i in `cat /tmp/hoge |awk -F : '{ print $3 }' | sort | uniq -d` do if [ $i != "" ]; then for ii in `cat /tmp/hoge` do echo $ii |awk -F ":" '{ if ( $3 -eq $i ) print $ii }' done fi done ■エラー awk: 0602-562 フィールド $() が正しくありません。 入力の行番号は 1 です。 ソースの行番号は 1 です。 linuxのシェルスクリプト linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。 【シェルスクリプト】 for文で単語分割させたくない シェルスクリプトのfor文で単語分割させないで、一行ずつ処理させるにはどうすればよいのでしょうか。 ---------- $ ca file test1 test1 test2 test2 test3 test3 ---------- #!/bin/bash for i in `cat file` do echo $i done ---------- 「test1 test1」、「test2 test2」、「test3 test3」といった具合に、行単位で処理したいです。 しかし結果は test1 test1 test2 test2 test3 test3 と単語分割されてしまいます。 空白を含んでいる場合に行単位で処理するにはどうすればよいのでしょうか。 空白を含んだシェル変数の代入 こんにちは。 空白を含んだシェル変数の代入について教えてください。 set test1="ABCD EFGHIJ" set w1=$test1 echo "w1 = $w1" このようなシェルスクリプトを実行させた時 w1 = ABCD と表示されてしまいます。 解決案があれば教えてください。 よろしくお願いします。 Bシェルでパイプ→exitがうまくいかない Bシェルで、下記のようにパイプの中でexitすることでスクリプトを終了させようとしたのですが、パイプした処理を抜けるだけexit 1 のところでスクリプトが終了せず、whileループの後のexit 0のところまで行ってスクリプトが終了しました。 パイプの中でexitすると、パイプの外に出るだけになるのでしょうか? どうすれば、パイプの中でスクリプトを終了させることができるのでしょうか? #! /bin/sh cat /tmp/tmp.dat | while read LINE do LL=LINE exit 1 done echo $LINE exit 0 また、これとは別に、変数LLに$LINEを代入して、その後LLをechoすると、$LINEの内容が出ると思ったら、中が空になっているようで何も出力されませんでした。 これを回避して、LLにLINEの内容を保存するような処理をしたいのですが、どうすればいいでしょうか? 以上、よろしくお願いします。 【シェルスクリプト】 ローカル変数、グローバル変数 シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。 solarisのシェルについて(sedコマンド) こんにちわ solarisのBシェルを現在使用しているのですが、 sedコマンドを使用して"を消したいのです。 具体的には # cat /tmp/test.log |sed | sed -e "s/"//g" というようなコマンドを打ちたいのですが、 この場合はどのようにすればよいのでしょうか? よろしくお願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム シェル ファイルの中身によって特定の処理 シェルスクリプトに関する質問です。 少しシェルで言語風なものを作ってみようと思い、作成したのですが、上手くいかないので質問させて頂きました。内容は、特定の文字がファイルに記載されているか判定して、 特定の文字だったら処理をするというものです。 現在、このようなソースになっています↓ #!/bin/sh - #ファイルを設定(仮) file_name="dummy.sh" #行数を変数へ格納 line=$(wc -l ${file_name}) #行数をlog.txtへ書き込む echo ${line} > log.txt #行数以外にファイル名があるので削除 sed -i "s/$file_name//g" log.txt #行数を格納 Line=$(cat log.txt) i=0 #全ての行を変数へ格納 #ここが問題 配列に変数が使えない!? while [ $i = ${Line} ] do array[$i]=$(sed -n "${i}p" ${file_name}) expr `${i} + 1` done # 格納した変数をチェックして、 # 指定された文字(hello)が書かれていればhelloと表示させる b=0 while [ $b = ${main_file} ] do if [ array[$b] = "hello" ] then echo "hello" fi expr `$b + 1` done ここで、配列を利用し、変数への代入が出来ませんでした。 ただ、エラーは表示されません。。。 環境はUbuntu10.10です。 何もいじっていないので、たぶん大丈夫だと思うんですが・・・ 何か解決策はありませんか? また、コレよりいい方法などがあればぜひ教えてください。 シェルスクリプトのコマンド グループ化における変数の有効範囲について教 シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? cshが詳しい方は教えてください cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。 シェルスクリプトの質問です シェルスクリプトの質問です 質問が連続してしまい、もうしわけございません。 1番目から13番目までの引数を表示させようと思い for i in `1 13` do eval echo '$'$i done をかいたのですが、10番目からは不正確になってしまいます。どうしてでしょうか? どなたかご教授お願いいたします。 シェルスクリプト文字列の処理について はじめましてよろしくお願いします。 質問サイトもシェルも初心者なので至らない点がございましたら ご容赦の程よろしくお願いします。 下記シェルスクリプトを実行すると下記エラーが発生します。 「test2」変数に空白無しで「abc」と入力するとエラーは発生しません。 変数test2の値(a bc)を変更せずにエラーが発生しない方法はないでしょうか? 手段でもかまいませんので教えてください。 ========================= testsh110207.sh ====================================== #!/bin/sh test1="abc" test2="a bc" if [ ${test1} = ${test2} ] then echo "=:文字列1と文字列2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if [ ${test1} != ${test2} ] then echo "!=:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ======================================================================= $ ./testsh110207.sh ./testsh110207.sh: line 6: [: too many arguments ./testsh110207.sh: line 13: [: too many arguments ********* テスト完了 ********* 行頭が数字の行を表示するシェルスクリプト 最近シェルスクリプトの勉強をはじめまして、一度自分で作ってみようと思い 行頭が数字の行を表示するシェルスクリプトを書いてみました。 が、うまく出来ません。 表示させたいファイルは字幕ファイルの始めの10行程度で内容は以下の様になってます 1 00:00:03,600 --> 00:00:07,195 xxxxxxxxxxxxxx xxxxxxxxxxxxxx 2 00:00:07,360 --> 00:00:09,635 xxxxxxxxxxxxxx xxxxxxxxxxxxxx ・ ・ ・ xxxxxxxxxxxxxの部分には英語の台詞が入ります。 以下が自分で作ってみたスクリプトです。 #!/bin/bash while read Line do if [ "$Line" eq [0-9][0-9] ] then echo $Line else : fi done < $1 表示させたいのは行頭が数字の行なので自分の望む結果は 1 2 3 ・ ・ ・ です。 初歩的な間違いかもしれませんが、自分にはどこが間違っているのか分かりません。 酷いスクリプトかもしれませんが、一応完成させてみたいのでご指導お願いしますm(_ _)m 簡単なシェルスクリプトを見てください。 次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか? シェルスクリプト 引数の引渡しについて こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター OS(技術者向け) Windows系OSLinux系OSBSD系OSSolaris系OSiOS(技術者向け)Android OS(技術者向け)その他(OS) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など