LINUX リダイレクション

リダイレクション

コマンドの実行結果は通常、標準出力であるディスプレイに出力される。 この実行結果はリダイレクション(>、>>)やパイプ( | )を使用することにより、ディスプレイではなくテキストファイルやコマンドに対して出力するように切り替えることができる。 また、リダイレクションはコマンドの出力先をテキストファイルに切り替える以外にも、これとは逆にコマンドへの入力元をテキストファイルに切り替えることもできる。

使い分け
●リダイレクション・・・データを渡す対象がファイルである場合はリダイレクションを使用する。
●パイプ・・・データを渡す対象がコマンドである場合はパイプを使用する。

リダイレクション [>, >>, <] ※リダイレクション記号(>、>>)の前後のスペースはあっても無くてもよいが、前方にのみスペースを入れる

# コマンドの出力を file へ上書きする
command >file
※書き込み対象のファイルが既に存在する場合は、対象ファイルの内容が全てクリアされ、コマンドの実行結果が出力される。対象ファイルが存在しなかった場合は新規にファイルが作成される。

# コマンドの出力を file へ追記する
command >>file
※書き込み対象のファイルが既に存在する場合は、対象ファイルの内容に追記する形で、コマンドの実行結果が出力される。対象ファイルが存在しなかった場合は新規にファイルが作成される。

リダイレクションはコマンドの出力先をファイルへ変更するのみならず、その逆も可能である。 つまり、コマンドへの入力元をファイルに切り替えることもできる。

# ファイル内容をコマンドへ渡す
command

LINUX ファイル加工 sedコマンド

abcall.xmlファイルに日々のデータ abc20160101.xml(1日前の日付のデータ) の連結を使用とした時の内容を記載する。

abc20160101.xml の先頭行に2行のタグが入っている。最終行もタグがあり、改行もある。

#!/bin/sh

YMD=date --date '1 day ago' +%Y%m%d

sed -e ‘$d’ abcall.xml ・・・最終行に改行が入っていたのでそれを削除
sed -e ‘$d’ abcall.xml > temp.xml・・・最終行のタグを削除して、temp.xmlファイル作成
sed -e ‘1,2d’ abc${YMD}.xml >> temp.xml・・・先頭行2行を削除して、temp.xmlの最終行に追加
mv temp.xml abcall.xml・・・加工したtemp.xmlファイルを元に戻してファイル連結完了

sedコマンドは結構使えるコマンドかもしれませんので、詳細を記載しておく。

sedコマンド
sed -e “s/OldText/NewText/g” samplefile >result
サンプルファイルの中のOldTextをNewTextに変換してresultに書き出す

sed -n ‘2p’ samplefileの2行目だけを出力する

sed -e “s/TexttoRemove//g”
文字列の削除

sed -e “s/^TexttoRemove//”
行頭の文字列を消す

sed -e “s/TexttoRemove\$//”
行末の文字列を消す
sedファイルを読み込んで実行
sample.sed
s/Jan/1月/ s/Feb/2月/

ls -la / | sed -f sample.sed
sample.sedから読み込んで実行
ドット(.)とアスタリスク(*)
sed -e “s/^…//”
行頭から3文字消去

sed -e “s/Pattern.*//”
Patternを含む行を削除する

USER=id |sed 's/uid=.*(\(.*\)) gid=.*/\1/'
ユーザーIDをUSERに代入

いろいろな例
awk ‘{printf “%-.5s\n”,$0}’
先頭から5文字だけを取り出す

cat file |tr ‘[A-Z]’ ‘[a-z]’ >lowfile
fileを小文字にする

sed -e ‘s///g
タブをスペースに変換

sed -e ‘*//g’
複数のスペースを1個スペースに変換
sed -e ‘s/^[]*//’
行頭のホワイトスペースを削除する

sed -e “s/[]*\$//”
行末のホワイトスペースを削除

sed -e “/Text/d”
Textという文字列を含んだ行を削除する

sed -e ‘/^$/d’
空白行を削除

sed -e “5,20s/OldText/NewText/g” file
5行目から3行目を処理

sed -e “5,$s/OldText/NewText/g” file
5行目から最後までを処理

sed -e ‘1d’ file
1行目を削除

sed -e ‘1,4d’ file
1行目から1行目を削除
sed -e ‘$d’ file
最終行を削除

sed -e ‘$-3,$d’ file
最終4行を削除
※linuxbeanでやったがエラーがでるので、使用時はちゃんと調べること。
結局、最終を消す’$d’を何度か回すことで対応した。

sed -n ‘n,mp’ file
nからmまでを表示

ls -l|grep ^[d].*|awk ‘{print $9}’~
配下のディレクトリを表示

LINUX シェルスクリプト内での日付

様々なサイトをみると微妙に表示が違い、その違いで日付の処理ができなかったりする。その内容をここにメモる。

昨日、当日のファイル処理で日付の設定を

YMD=date ‘+%Y%m%d’  このようにした。では、1日前は?ってことで

date --date '1 day ago' +%Y%m%d  が正解。

また、LINUXのディストリビューションによっても表現が違うので注意が必要だ。
また、シェルスクリプト内だと、カンマ?等がでてくるのでこれも複雑で困る。
とにかく、シェルスクリプトないでは、上記のように記載すれば動いてくれた。

ちなみに、5日前なら、date --date '5 day ago' +%Y%m%d とやればいいようだ。
数字だけいじればいいので簡単だね。

Linux シェルで使う特殊記号の無効化

シェルで自動でftp接続をしようとしたが、どうしてもエラーがでる。
530 Login incorrectとでた。これは、idとかpwが違うときにログインできないエラーのようだ。

そこで、ftpのパスワードをみると特殊記号が入っている。その特殊記号がパスワードにはいっていると違う意味になりパスワードエラーになる。

” $ @ & ‘ ( ) ^ | [ ] { } ; * ? < > ` \ スペース
改行,タブといったエスケープ・シーケンス

上記のような記号がパスワードにはいると違う意味をもつらしい。
その場合は、バック・スラッシュ\(※\が出る場合もあるがそのままでOK)を、その特殊記号の前にいれると、その後ろの記号が意味を無効にしてくれる。

たとえば、A&B : $10と表示させたい場合、下記のように\(¥)をいれると無効化される。

$ echo A\&B\ :\ \$10
A&B : $10

今回実際lftpにて、なんどやってもエラーになるパスワードがあった。

7k&xbZ;)>vLav といいうパスワードの場合だが、$;)>という記号の前に¥をいれてもエラーがでた。いろいろとやってみて結局

7k¥&xbZ¥;)¥>vLav つまり、)の部分には、¥がいらなかった。今ひとつ不明ではあるが、怪しい場合には、足したり、引いたりすればいけるってことだけはわかった。

また、:の前にも¥が必要なかった。

LINUX FTPの自動化転送

下記のスクリプトで、実行すれば、設定したディレクトリに転送したいファイルが転送される。実際に実験したが、コマンドからやると一瞬で作業が完了して、処理しているか不安になるくらいだ。

ftp [-ginv] [host]

-g 正規表現によるファイル名展開を無効にする
-i 複数のファイルの転送中に,プロンプトを出力しない
-n .netrcを使用した自動ログインを行わない
-v リモート・サーバーから送られたすべての情報を表示する
host 接続するリモート・ホストを指定する

#!/bin/sh
HOST_NAME=”ホスト名またはIPアドレス”
USER_NAME=”ftpユーザー名”
PASSWORD=”パスワード”
LOCAL_DIR=”ローカル側の作業ディレクトリ”
GET_DIR=”ftp先の作業ディレクトリ”
FILE_NAME=”getするファイル名”

ftp -n ${HOST_NAME} << _EOF_ user ${USER_NAME} ${PASSWORD} bin lcd ${LOCAL_DIR} cd ${GET_DIR} get ${FILE_NAME} bye _EOF_