表示桁数をそろえた文字列の格納方法

このQ&Aのポイント
  • ログファイルを時間で検索するシェルスクリプトを作成する際、変数に表示桁数をそろえた文字列を格納したい場合、printfの%02dを使用すると正しく生成することができます。
  • 例えば、01と表示されるように、変数hの値に%02dを指定して、printfでフォーマットすることができます。
  • 具体的には、searchStr="Jun 23 $(printf "%02d" $h):$(printf "%02d" $m)"のように記述します。これにより、変数hやmの値が1桁の場合でも、2桁の表示を保つことができます。
回答を見る
  • ベストアンサー

表示桁数をそろえた文字列を変数に格納したい

ログファイルを、時間で検索するシェルスクリプトを作成したいと考えています。 変数searchStr に、ログから検索対象となる時間をループで生成したい。 例:「Jun 23 00:23」(※この文字列を作成したい。) 以下スクリプト作成しましたが 結果として、変数h、mが、1~9の時、searchStr は「Jun 23 0:23」や「Jun 23 0:3」になります。 時間と分の桁数が、変数が1ケタの場合、1→01としたい。 printfの%2dとか指定し、変数に入れてみたりしたのですが上手く文字列を生成することが出来ないのです。 (searchStr="Jun 23 `printf "%02d" $h` :" 等してみましたが、00が入っただけで、01とかになりませんでした。) #!/bin/bash for((h=0;h<24;h++)) do for ((m=0;m<59;m++)) do searchStr="Jun 23 "$h":"$m echo $searchStr #文字列確認 cat ログファイル | grep searchStr #ここで検索するための文字列を作成したい。 done done 良い解決方法がありましたら、ご教示お願いします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> searchStr="Jun 23 `printf "%02d" $h` :"  なりましたけど? このままだと、$mの方は%02dが適用されませんが。 > for((h=0;h<24;h++)) > for ((m=0;m<59;m++)) これだと、毎時59分は検索しませんが、それで正しいですか? > cat ログファイル | grep searchStr #ここで検索するための文字列を作成したい。 単にログファイルから検索するだけなら、catしなくても grep "$searchStr" ログファイル で十分。 > echo $searchStr #文字列確認 等と時間毎の処理が入っていますが、これが必要無いなら、正規表現を使ってまとめて検索するという方法もあります。 > cat ログファイル | grep searchStr #ここで検索するための文字列を作成したい。

kureakai
質問者

お礼

>なりましたけど? このままだと、$mの方は%02dが適用されませんが。 再度動かしてみたら、できました。 なぜだめだったんだろう…。 ありがとうございます。 他の指摘いただいた部分は、自分で直しておきました。 御教示、ありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

>(searchStr="Jun 23 `printf "%02d" $h` :" 等してみましたが、00が入っただけで、01とかになりませんでした。) 確認の仕方が悪いのでは?$mについても同様にすれば、それで合ってます。 普通は、こうシンプルに書きますが、まあ、どっちでも同じ結果で、うまくいきます。 searchStr=`printf "Jun 23 %02d:%02d" $h $m`

kureakai
質問者

お礼

>(searchStr="Jun 23 `printf "%02d" $h` :" 等してみましたが、00が入っただけで、01とかになりませんでした。) 確かに動きました…。 なぜか原因不明でしたが。 >searchStr=`printf "Jun 23 %02d:%02d" $h $m` こちらのほうも参考にさせて頂きます。 御教示ありがとうございました。

  • mkt23456
  • ベストアンサー率33% (21/63)
回答No.2

自分もスマートに書けないですが、 a=2 c="00"$a echo c$ echo ${c:(-2):2} あたりでヒントになりませんか?

kureakai
質問者

お礼

サンプルありがとうございます。 参考にさせて頂きたいと思います。 御教示ありがとうございました。

関連するQ&A

  • PHPの文字列変数をJavaScriptのalertで表示させたい

    <?php  $mes = 123; print<<<EOF  <script Language="JavaScript">  <!--   JavaScript:alert( $mes );  //-->  </script> EOF; ?> ↑のコードを実行すると123というメッセージボックスが表示されます。 <?php  $mes = "aaa"; print<<<EOF  <script Language="JavaScript">  <!--   JavaScript:alert( $mes );  //-->  </script> EOF; ?> しかしこのように数値変数でははく文字列変数を渡すと表示できません。 JavaScriptにPHPの文字列変数を受け渡すことはできるのでしょうか?

    • ベストアンサー
    • PHP
  • (JavaScript)変数や文字列難しい

    JavaScript 第1問目 // [変数 - 右辺が変数を使った式1] // ---------------------------------------- // 変数sに、変数piの値に変数rの値を2回掛け合わせた値を代入してください let pi = 3.14; let r = 5; ×let s = ; console.log("円の面積は" + s); ※×は間違い。 第2問目 // ---------------------------------------- // [文字列 - 大文字に変換1] // ---------------------------------------- // 変数cの文字を大文字に変換して出力してください let c = "p"; ×console.log(toUpperCase+()); ※×は間違い。 第1問目 ×let s = ;のところですが、let s = (3.14*5)+(3.14*5);でも間違いです。変数sに、変数piの値に変数rの値を2回掛け合わせた値の計算方法やコードは何でしょうか? 第2問目 ×console.log(toUpperCase+());のところですが、console.log(toUpperCase+("p"));やconsole.log(toUpperCase+("c"))は違います。console.log{toUpperCase+}も違います。大文字に変換するコードは何でしょうか?

  • double型を文字列で。

    doubleが文字列表現したいのですが、printfで"%f"をしていしても桁が足りません。 検索で調べても桁を指定しているものが多く、汎用的ではないように見えます。 変数にセットされたdouble値をそのまま文字列で表現する方法はないのでしょうか?

  • 空白を含んだ文字列がうまく格納(表示)できない

    こんにちわ。 空白(スペース)の入った文字列の格納(表示)について質問させてください。 以下のプログラムを実行すると、空白の含む文字列がうまく表示されません。 例えば、 in the worldと入力しても、inしか格納されていないみたいです。それはなぜでしょうか? また、どうすればそれを格納、表示させることができるのでしょうか?教えてください。よろしくお願いいたします。 #include <stdio.h> #include <string.h> main() { char buf[BUFSIZ]; char moji[31]; int i; printf("Input string: "); fgets(buf, sizeof(buf), stdin); moji[31] = '?0'; sscanf(buf, "%s", moji); i = 0; while (moji[i] != '?0') { printf("%c",moji[i]); i = i + 1; } printf("?n"); printf("%d letters?n", i); } 【実行例】 csx01:~> gcc prog.c csx01:~> a.out Input string: in the world in 2 letters

  • 変数内のコマンドの実行コマンド文字列の表示

    変数内のコマンドの実行コマンド文字列の表示 DIG=`dig ドメイン` として変数内のコマンド実行結果を printf "$DIG\n"と表示させることはできるのですが、 実際に実行したコマンドを表示させることはできますでしょうか。 逆に DIG="dig ドメイン" として文字列をセットすればコマンド内容は表示されますが、 今度はコマンドとして実行させる方法がわかりません。 `$DIG`としてもprintf "$DIG\n"などいろいろ試しましたが わかりません。。 どなたかおわかりでしょうか

  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • 文字列と変数の値をエディットボッスクに表示させたい

    VC++6.0,MFC,ダイアログベースでプログラミングしています。 エディットボックスに文字列と変数の値を表示させたいのですが、その方法が分かりません・・。 コンソールベースの場合の、 int a=1; printf("a = %d",a); で、「a = 1」と出力されるようにしたいです。 今は、 m_Display = "a = %d"; UpdateData(FALSE); UpdateWindow(); というように作っているので、上記と同様にできませんでした。 このような場合どうしたらよいのでしょうか? よろしくお願いします。

  • 文字列を分割して変数に格納したい

    文字列を分割して変数に格納したいのですがうまくいきません。 ---以下ソース--- #include <stdio.h> #include <string.h> void main(void){ char tai[]="name1=value1&name2=value2&name3=value3&name4=value4"; char *tp; int a; int b; int i; int co=0; a=strlen(tai); for(i=0;i<a;i++){ if(tai[i] == '='){ co++; } } b=co; char *nameset[b]; char *valueset[b]; *nameset[0]=*strtok( tai,"&=" ); i=1; co=0; while ( tp != NULL ) { if(0==i%2){ co=i/2; *nameset[co] = *strtok( NULL,"&=" ); } else{ co=i/2; *valueset[co] = *strtok( NULL,"&=" );} i++; } for(i=0;i<b;i++){ printf("%s : %s\n",nameset[i],valueset[i] ) } } ---ソースここまで--- どうしたらちゃんと変数に格納されますか?

  • TeraTermマクロの文字列結合

    hostname = "100.100.100.100" log="20101010" という変数をteratermマクロで設定しております。 この二つの変数の間に、空白または_(アンダーバー)を一つ入れて "100.100.100.100_20101010" という文字列を作成して、変数に格納するなりしたいのです。 ただ、hostname変数とlog変数の中身は変えれないので、 hostname = "100.100.100.100_"や、log="_20101010"の このやり方以外でお願いします。 ご教授よろしくお願いします。

  • PHPの文字列をJavascriptの変数にする

    PHPの変数に格納された文字列を、直接Javascriptの変数の一部として格納しようと考えています。 例:) <script> var txt = "<?php echo $text; ?>"; </script> しかし、$textにダブルクォーテーションなどの文字が含まれていると、スクリプト全体が破綻します。今のところ、PHPの中で、問題を起こしそうな文字列を変換するように処理しています。 例:) $text = str_replace("\\", "\\\\", $text); $text = str_replace("\"", "\\\"", $text); $text = str_replace("\n", "\\n", $text); これよりもスマートな方法(たとえば用意されている関数を使うなど)がありますでしょうか。

    • ベストアンサー
    • PHP