bashで書かれていたコードを読解していたのですがわからないことがたくさんあったので質問させていただきます。
bashは触ったことがないので全くの初心者になります。
今回わからないことは
・LST_DATABASE="$BASE_DIR/database.lst"と宣言していきなり、echo "[$LST_DATABASE]"で宣言していない$LST_DATABASEが出てくること。
これはLST_DATABASE=$LST_DATABASEなのか?
・hive -S -v -f $変数A > $変数B の処理 -vはなんでしょうか?調べてもでてきません。
hive -S -f $変数A > $変数B はサイレントモードで$変数ファイルAを$変数Bに出力だと思いますが。。。
・if [ "$tblname" != "" ];then の動き
これは"$tblname"の!= が空白の時ということですか?
これも意味がよくわかりません。
"$tblname"=""ならわかるのですが。。。
・cp /dev/null $変数 の処理
cpはコピーするということで/dev/nullのパスを$変数にコピーするということでしょうか?
・tblname=echo $line | awk '{print $3}'
の処理
$line書き出しをawk {print $3}を利用して入力ファイルの各行の 3番目のフィールドが出力される処理に出力するというのはつまりどういうことになるのでしょうか?
下記がコードと読解したメモになります。
. /opt/mapr/mapr_bashrc BASE_DIR="/var/www/html/WebHive/entity/data" //BASE_DIR=ログファイルのある場所のパス #データベース一覧情報 LST_DATABASE="$BASE_DIR/database.lst" echo "[$LST_DATABASE]" //$LST_DATABASEの書き出し hive -S -e "show databases;" > $LST_DATABASE //$LST_DATABASEに対してshow databases;を実行で取得したデータを$LST_DATABASEに出力。 //余計なMsgを出力させたくない時はサイレントモード-Sを利用する。-eオプションで通常のコマンドからクエリを実行することが可能。>=リダイレクト while read dbname //DBの名前を読み込む。 while 文は「ある条件が成り立っている間のみ繰り返し処理を実行する」といった、不定回の繰り返し処理を行う場合に使用するループ制御文である。 do //ループ開始 #ディレクトリ作成 if [ ! -d "$BASE_DIR/$dbname" ];then //if文開始 ディレクトリが"$BASE_DIR/$dbname"ではない場合 then=if文で必要な宣言。 //-d=ディレクトリ。 mkdir $BASE_DIR/$dbname //$BASE_DIR/$dbnameでディレクトリを作る。 fi //if文終了 if [ ! -d "$BASE_DIR/$dbname/table" ];then //ディレクトリが"$BASE_DIR/$dbname/table"ではない場合 mkdir $BASE_DIR/$dbname/table //$BASE_DIR/$dbname/tableでディレクトリを作る。 fi if [ ! -d "$BASE_DIR/$dbname/partition" ];then //if文開始 ディレクトリが"$BASE_DIR/$dbname/partition"ではない場合 mkdir $BASE_DIR/$dbname/partition //$BASE_DIR/$dbname/partitionでディレクトリを作る fi #テーブル一覧 LST_TABLE="$BASE_DIR/$dbname/table.lst" echo "[$LST_TABLE]" //$LST_TABLEの書き出し hive -S -e "use $dbname;show tables;" > $LST_TABLE //ディレクトリを作った$dbnameに対してshow tables;を実行で取得したデータを$LST_TABLE出力。 #テーブル情報取得 TBL_HQL_FILE="$BASE_DIR/$dbname/table.hql" TBL_TMP_FILE="$BASE_DIR/$dbname/table.tmp" echo "[$TBL_HQL_FILE]" //$TBL_HQL_FILEの書き出し echo "use $dbname;" > $TBL_HQL_FILE //use $dbname;の書き出しを$TBL_HQL_FILEに出力 while read tblname //テーブルの名前を読み込む do echo "desc formatted ${tblname};" >> $TBL_HQL_FILE //${tblname}のテーブルの情報の表示結果を$TBL_HQL_FILEに追加上書き //テーブルの情報を表示する。DESCRIBEは省略して「DESC」を使用可能。formattedを付けると、詳細情報が整形された分かりやすい状態で表示される。>>=ファイルに追加書き込みした場合は>>を使う。 done < $LST_TABLE //done に $LST_TABLEを出力。 done=ループ終了。 hive -S -v -f $TBL_HQL_FILE > $TBL_TMP_FILE /-vが何か不明。おそらく$TBL_HQL_FILEをサイレントオプショんとなんらかのオプションの実行結果を$TBL_TMP_FILEに出力 //-fでクエリを記述したファイルを読み込ませて実行 //-f=ファイル #テーブル情報個別ファイル出力 LST_DESC="" while read line //ラインの読み込み do if [ "`echo $line | grep '^desc formatted'`" != "" ];then //よく意味がわからない。$lineの書き出だし|^desc formattedから始まる行の探し出し。!=空白の場合 //grep=ファイルや標準入力から正規表現でマッチする行を探し出すコマンド tblname=`echo $line | awk '{print $3}'` //awkがイマイチ理解できていない。tblname=$lineの書き出し。awk {print $3}を利用して入力ファイルの各行の 3番目のフィールドが出力する。 if [ "$tblname" != "" ];then //よく意味がわからない。$tblname !=空欄の場合?。 LST_DESC="$BASE_DIR/$dbname/table/${tblname}.dat" echo "[$LST_DESC]" //$LST_DESCの書き出し。 cp /dev/null $LST_DESC //よく意味がわからない。/dev/nullというパス?を$LST_DESCという変数でコピー? //cp=おそらくファイルコピーのコマンド fi continue //continueによって次の繰り返しに飛ぶ. fi if [ "$LST_DESC" == "" ];then //$LST_DESC=空白の時。 continue fi echo $line >> $LST_DESC //$lineの書き出しデータを$LST_DESCに追加上書き。 done < $TBL_TMP_FILE // doneに$TBL_TMP_FILEの結果を出力。 #パーティション情報取得 PRT_HQL_FILE="$BASE_DIR/$dbname/partition.hql" PRT_TMP_FILE="$BASE_DIR/$dbname/partition.tmp" echo "[$PRT_HQL_FILE]" //$PRT_HQL_FILEの書き出し echo "use $dbname;" > $PRT_HQL_FILE //use $dbname;の書き出しを$PRT_HQL_FILEに出力 tblname="" while read line do if [ "`echo $line | grep '^desc formatted'`" != "" ];then //$lineの書き出だしをdesc formattedから始まる行の探し出し。!=空白の場合の処理に出力 //|=パイプ:あるプロセスの実行結果を別のプロセスの入力にリダイレクトすることもできる. tblname=`echo $line | awk '{print $3}'` //awkがイマイチ理解できていない。tblname=$lineの書き出し。awk {print $3}を利用して入力ファイルの各行の 3番目のフィールドが出力する。 continue fi if [ "$tblname" == "" ];then //$tblname !=空欄の場合。 continue fi if [ "`echo $line | grep '^# Partition Information'`" != "" ];then //$lineの書き出だしをPartition Informationから始まる行の探し出し。!=空白の場合の処理に出力 echo "show partitions $tblname;" >> $PRT_HQL_FILE //show partitions $tblname;の書き出しを$PRT_HQL_FILEに追加上書き tblname="" continue fi done < $TBL_TMP_FILE //doneに$TBL_TMP_FILEを出力 hive -S -v -f $PRT_HQL_FILE > $PRT_TMP_FILE //-vが何か不明。おそらく$PRT_HQL_FILEをサイレントオプショんとなんらかのオプションでの実行結果を$TBL_TMP_FILEに出力 #パーティション情報個別ファイル出力 LST_PART="" while read line do if [ "`echo $line | grep '^show partitions'`" != "" ];then //$lineの書き出だしをshow partitions!=空白の場合の処理に出力 tblname=`echo $line | awk '{print $3}'` //awkがイマイチ理解できていない。tblname=$lineの書き出し。awk {print $3}を利用して入力ファイルの各行の 3番目のフィールドが出力する。 if [ "$tblname" != "" ];then //よく意味がわからない。$tblname !=空欄の場合?。 LST_PART="$BASE_DIR/$dbname/partition/${tblname}.dat" echo "[$LST_PART]" //$LST_PARTの書き出し cp /dev/null $LST_PART //よく意味がわからない。/dev/nullというパス?を$LST_DESCという変数でコピー? fi continue fi if [ "$LST_PART" == "" ];then continue fi echo $line >> $LST_PART //$lineの書き出しを$LST_PARTに追加上書き done < $PRT_TMP_FILE //doneに$PRT_TMP_FILEを出力 done < $LST_DATABASE //doneに$LST_DATABASEを出力 exit 0
回答4件
あなたの回答
tips
プレビュー