2014年2月17日月曜日

第20回「2重起動チェックをする」

Cronで処理完了していないのに、またCronが実行して、2重起動しないようにしてください。。
さて、第20回のお題は「2重起動チェックをする」です。

2重起動チェックはfuserコマンド(使用しているプロセス表示)と、awkのNF(フィールド数表示)を利用します。

[check.sh]
#!/bin/sh
fuser a.sh 2>/dev/null | awk '{ exit NF }'
if [ $? -gt 1 ] ; then
echo '複数起動中…'
exit
fi
sleep 1000

check.shを起動中にcheck.shを起動すると、
exit NFが終了ステータス($?)になり、2(プロセス数)となります。(1つ起動していれば、1になる)
[ $? -gt 1 ]は、$?が1より大きいときに、
echo '複数起動中…'
になります。(1つ起動したときは、echoされない。2つ以上でechoされる。)
2>/dev/nullの標準エラーは、awkのNF(フィールド数表示)にカウントさせないようにしています。

2014年2月11日火曜日

第19回「PerlでUNIXコマンドを実行する」

シェルコマンドを愛用しているので、Perlのソース見てもよくわかりません。。
さて、第19回のお題は「PerlでUNIXコマンドを実行する」です。

UNIXコマンドをPerlで加工できれば、使う機会が増えると思いました。

[test.pl]
#!/usr/bin/perl
my $ret;

$ret=`ls -1`;
print $ret;

[実行結果]
a.sh←printの結果
test.pl←printの結果

[test2.pl]
#!/usr/bin/perl
my $ret;

$ret=system "ls -1";
print $ret;

[実行結果]
a.sh←systemの結果
test.pl←systemの結果
0←printの結果

``(バッククォート)だと、標準出力されず結果を返り値に設定します。
system関数だと、標準出力されて実行プログラムのステータスコードを返り値に設定します。
``(バッククォート)またはsystem関数の後、$?を指定すると実行プログラムのステータスコードになります。
シェルスクリプトをPerlで実行するにはこんな感じです。
$ret=`./a.sh`;
$ret=system "./a.sh";

2014年2月8日土曜日

第18回「Officeのリボンが使いづらいので、Office 2003 スタイルに変更する」

MicrosoftのWindows、Officeが年々使いづらくなっていっているように
(シンプルではなくなっている)感じます。。

いまさらですが、Officeのリボンになってからといい、
どこに何があるやらわけわかんないです。
Office 2003 のシンプルメニューで、文字を羅列しててくれと感じます。

「Office 2007-2013 オールドスタイルメニュー」アドインを使えば、
リボンから解放されます。

第17回「ファイル名を指定すべき引数を標準出力(標準入力)で実現するハイフン(-)」

diff ファイル名1 ファイル名2 の「ファイル名2」を標準出力にするお話です。

さて、第17回のお題は「ファイル名を指定すべき引数を標準出力(標準入力)で実現するハイフン(-)」です。

diff file1.txt file2.txt | diff file3.txt -

ハイフン(-)のところは、ファイル名を指定しないといけないのですが、
ハイフン(-)が「diff file1.txt file2.txt」の標準出力になり、
file3.txtとdiffができます。

つまり、
diff file1.txt file2.txt > file.tmp
diff file3.txt file.tmp
みたいに、file.tmp作らなくてもいいので、
環境に優しい作りになります。

2014年2月7日金曜日

第16回「grepで複数条件を除外して表示する」

変なエラーがでていないか確認してください。。

さて、第16回のお題は「grepで複数条件を除外して表示する」です。

同じエラーがたくさん出ていて、
ひょっこり違うエラーを紛れ込んでいる可能性があるので、
同じエラーを除いて表示して確認していきます。

grep -v -e エラー1条件文字列 -e エラー2条件文字列 *.log
or
grep -v エラー1条件文字列 *.log | grep -v エラー2条件文字列

いつも心の中では、変なエラーがでないように祈っています。。

2014年2月4日火曜日

第15回「ExcelをWordに貼り付けるVBAマクロ」

コマンド単位の作業は、テキストファイルがいいです。

さて、第15回のお題は「ExcelをWordに貼り付けるVBAマクロ」です。

第14回のお題「Excelの取り消し線を取り除いてテキストに貼り付ける」で
Excelの複数シートをWordに貼り付ける作業を自動化します。

※Visual Basic Editor→ツール→参照設定→Microsoft Word Object Libraryにチェックする
Option Explicit
Sub ExceltoWord()

Dim ObjWord As Word.Application
Dim WordDoc As Object

Set ObjWord = CreateObject("Word.Application")
ObjWord.Application.Visible = True

Set WordDoc = ObjWord.Application.Documents.Add

WordDoc.ActiveWindow.Selection.TypeText Text::="■■■Sheet1■■■" & vbCrLf
MaxRow = Worksheet("Sheet1").cells(Rows.Count,20).End(xlUp).Row
Worksheets("Sheet1").Range("T5:T"&MaxRow).Copy
WordDoc.ActiveWindow.Selection.TypeText Text::="■■■Sheet2■■■" & vbCrLf
Worksheets("Sheet2").Range("A1:A10").Copy
WordDoc.ActiveWindow.Selection.Paste

'取り消し線削除
ObjWord.Selection.Find.Text= ""
ObjWord.Selection.Find.Font.StrikeThrough = True
ObjWord.Selection.Find.Replacement.Text = ""
ObjWord.Selection.Find.Forward = TRUE
ObjWord.Selection.Find.Wrap= wdFindContinue
ObjWord.Selection.Find.Execute ,,,,,,,,,,wdReplaceAll

'txtで保存
WordDoc.SaveAs2 Filename:="test.txt", FileFormat:=wdFormatText, InsertLineBreaks:=True
ObjWord.Quit

Set WordDoc = Nothing
Set ObjWord = Nothing

Application.CutCopyMode = False

End Sub

※MaxRowの20はTを表しています。
自動化できるところは自動化して、シンプルにできるところはシンプルにするがいいです。。