ページ

ラベル コマンド の投稿を表示しています。 すべての投稿を表示
ラベル コマンド の投稿を表示しています。 すべての投稿を表示

2013年7月2日火曜日

deteコマンドの使い方

dateコマンドは日付を確認するための機能ですが思いのほかオプションが
あり覚えられないのでよく利用するものをメモ
自分でよく利用するのはyyyy/MM/ddなので原則こちらのフォーマットにあわせています.

主に自分で利用するのは、今日、昨日、今月末、30日前などがよく利用します.


dateコマンド例(yyyy/MM/dd)
目的 コマンド
今日 date +'%Y/%m/%d'
明日 date -d '1day' +'%Y/%m/%d'
昨日 date -d '1day ago' +'%Y/%m/%d'
月初 date +'%Y/%m/01'
月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'1 month'`"
前月 date -d '1month ago' +'%Y/%m/%d'
前月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01'`"
来月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'2 month'`"
来月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'2 month'`"
1年前 date +'%Y/%m/%d' -d '1 year ago'
30日前 date +'%Y/%m/%d' -d '30day ago'


ついでに簡単な時間も出してみます。


dateコマンド例(hh:mm:ss)
目的 コマンド
現在時刻 date +'%H:%M:%S'
1時間前 date -d '1hour ago' +'%H:%M:%S'
1時間後 date -d '1hour' +'%H:%M:%S'

dateコマンドは意外と利用するがよく利用するのをメモするべきですね

2013年6月23日日曜日

改行付きcsvのパース

csvからtsvへコンバートが欲しかったのですが、 改行コードが入っているcsvであったため楽にできませんでした。 csvは改行コードがある場合ダブルクォーテンションで囲まれているのが特徴です。
下記のサイトに改行コードが含んでいるcsvをパースする方法がperlありましたので こちら 改変しましてコード化しました。
csv2tsv.pl
#!/usr/bin/perl
use strict;
use warnings;
my $column = '';
while (my $line = ) {
    my $count = 0;
    $line .=  while ($line =~ tr/"// % 2 and !eof(STDIN));
 
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
    my @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
    ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
    for $column (@values) {
        $column =~ s/\x0D\x0A|\x0D|\x0A//g;
        print $column, "\t";
    }
    print "\r\n";
}

上記をcsv2tsv.plとしてサンプルを作成いたしました。 test.csv
header1,header2,header3
test1,test2, "test,3"
"test
1",test2,test3 
上記が、サンプル用csvとなります。
cat test.csv | csv2tsv.pl
こちらのサンプルで改行付きcsvをパースできます。

2013年6月17日月曜日

bashでfor next

備忘録となるがシェル(bash)でforを利用したカウンタを作る際に苦労したので
紹介

やりたいことは、JavascriptやC言語などでよくある
for (i = 0; i < 10; i+=2) {
 処理を記述
}

上記みたいなi+=2のfor文を作りたい


実際にシェルで記載

#!/bin/bash
for i in `seq 0 2 10`;
do
  echo "${i}"
done
上記で対応ができるbash的にはforはforeachみたいな役割なので 少々書き方が面倒だが便利に行えます。

2013年4月25日木曜日

Linuxでmailに添付ファイルを付ける【uuencodeを利用しない】

Linuxでシェルを作っていると、メールを送信すること
またメールに、添付ファイルを付けたくなった
既存のコマンドだけで可能な限り対応できないかと模索し
シェルを作成。
よく目にするのは、uuencodeコマンドを利用する方法だが
今回は動作環境の事情もあり、該当のコマンドを利用しない方帆を記載

sendmailコマンドを利用し対応、少し汎用性は付けたが
ほぼ基礎のみ比較的簡単に添付ファイルが送付可能
複数のファイルには非対応のため注意が必要

原理は、mailはテキストを特定の書式で送るのが原理のため
書式を手動で作成すれば良い

メールの仕様書を読めばより理解が深まるだろう

環境
環境情報 構築日 ソフトウェア 必要込コマンド
CentOS 5.6 2013/04/25 なし sendmail


#!/bin/bash

############################
## メール添付ファイルスクリプト
## コマンドラインから添付付きメールを送信するスクリプトです.
## ※日本語部分対応のため、完全ではございません.
##
## mail.sh {fromアドレス} {toアドレス} {タイトル} {本文} {添付ファイル名}
##
############################

## 初期化
from_address=$1
to_address=$2
subject=$3
mail=$4
TMP_FILE='mail.tmp'
boundary=`date +%Y%m%d%H%M%N`
content_type=`file --mime $1 | cut -d' ' -f2`
filename=`echo $5 | sed -e "s/.*\/\(.*$\)/\1/"`

## メール情報付与
echo "From: $from_address" > $TMP_FILE
echo "To: $to_address" >> $TMP_FILE
echo "Subject: $subject" >> $TMP_FILE
echo "MIME-Version: 1.0" >> $TMP_FILE
echo "Content-type: multipart/mixed; boundary=\"----$boundary\"" >> $TMP_FILE
echo "Content-Transfer-Encoding: 7bit" >> $TMP_FILE
echo "" >> $TMP_FILE
echo "This is a multi-part message in MIME format." >> $TMP_FILE
echo "" >> $TMP_FILE

## 本文
echo "------$boundary" >> $TMP_FILE
echo "Content-type: text/plain; charset=iso-2022-jp" >> $TMP_FILE
echo "Content-Transfer-Encoding: 7bit" >> $TMP_FILE
echo "" >> $TMP_FILE
echo "$main" >> $TMP_FILE
echo "" >> $TMP_FILE

## ファイル情報(base64で送信)
echo "------$boundary" >> $TMP_FILE
echo "Content-type: $content_type" >> $TMP_FILE
echo " name=$filename" >> $TMP_FILE
echo "Content-Transfer-Encoding: base64" >> $TMP_FILE
echo "Content-Disposition : attachment;" >> $TMP_FILE
echo " filename=$filename" >> $TMP_FILE
echo "" >> $TMP_FILE
cat $5 | base64 >> $TMP_FILE
echo "" >> $TMP_FILE
echo "------$boundary--" >> $TMP_FILE

## メールを送信
sendmail -i $to_address < $TMP_FILE

## 一時ファイルを削除
rm -f $TMP_FILE

exit 0

多少便利ぐらいで使う用途が限定されるが 意外と便利である 検証中に尽き動作保証できないが雰囲気が理解いただけるかと思います。