プログラミングメモ
chmod
階層的にファイルのパーミッションを変更したい:
% find . -type d -exec chmod 775 {} \; # ディレクトリの場合
% find . -type f -exec chmod 664 {} \; # ファイルの場合
				
			date(BSD系)
現在の日付と時刻:
% date '+%Y-%m-%d %H:%M:%S'
				
				現在の日付+曜日と時刻:
% date '+%Y-%m-%d(%a) %H:%M:%S'
				
				現在の日付から一か月前:
% date -v-1m '+%Y-%m'
				
				昨日の日付:
% date -v-1d '+%Y-%m-%d'
				
				ある日の曜日:
% date -j -f '%Y%m%d' '20250108' '+%a'
				
				ある日の一日前:
% date -v-1d -j -f '%Y%m%d' '20250101' '+%Y%m%d'
				
			diff
タブ・スペースを無視して比較したい:
% diff -w file1.txt file2.txt
				
				比較結果を見やすくしたい:
% diff --side-by-side --suppress-common-lines file1.txt file2.txt
				
			EXCEL
文字列の結合:
="| "&A2&" | "&B2&" | "&C2&" |"
				
				空白ではないセルの個数:
=COUNTA(A2:A10)
				
				条件:
=IF(A2>10,"該当","非該当")
=IF(OR(A2=5,A2=10),A2,"-") # A2セルが5または10
=IF(AND(A2>=10,A2<=30),A2,"-") # A2セルが10~30の範囲
=IF(A2="mogi","○") # A2セルがmogi
				
				セルの参照:
=INDIRECT("A2") # A2のセルを参照する
=INDIRECT("A"&RANDBETWEEN(2,COUNTA($A$2:$A$10)+1)) # A列からランダムに情報を取り出す
				
				セルの先頭や末尾のスペース削除、2つ以上のスペースを1つだけ残す:
=TRIM(A2)
				
				文字列置換:
=SUBSTITUTE(A2," "," ") # 全角スペースを半角スペースに置換
				
				文字列分割(一つのセルにパイプ区切りで2カラム分の文字列が入っている場合):
=LEFT(A2,FIND("|",A2)-1) # パイプ左側
=MID(A2,FIND("|",A2)+1,LEN(A2)) # パイプ右側
				
				文字列分割(一つのセルにハイフン区切りで3カラム分の文字列が入っている場合):
=LEFT(A2,FIND("-",A2)-1)
=MID($A2,FIND("-", $A2)+1,FIND("-", $A2,FIND("-", $A2)+1)-FIND("-", $A2)-1)
=RIGHT($A2,LEN($A2)-FIND("-", $A2,FIND("-", $A2)+1))
				
				文字列チェック(A列に、B列の文字列が含まれるかどうか):
=ISNUMBER(SEARCH(B2, A2))
				
				0以上、1未満の乱数:
=RAND()
				
				範囲指定した乱数の発生:
=RANDBETWEEN(1,10) # 1~10までの乱数を発生させる
				
				順位、ランキング:
=RANK(A2,A$2:A$10) # 2番目のパラメータは絶対参照
				
				順位・ランキングで上位3までを表示:
=IF(RANK(B2,B$2:B$99)<=3,RANK(B2,B$2:B$99),"")
				
				文字列を数値に変換する:
=VALUE(A2)
				
				書式の設定(茂木ネットワークセンター標準日付表記):
yyyy-mm-dd(aaa)
				
				書式の設定(1000分の1秒まで表記):
mm:ss.000
				
				dd-mm-ssまたはddd-mm-ss形式の経緯度を秒形式に変換:
=(LEFT(A2,FIND("-",A2)-1)*3600)+(MID($A2,FIND("-", $A2)+1,FIND("-", $A2,FIND("-", $A2)+1)-FIND("-", $A2)-1)*60)+(RIGHT($A2,LEN($A2)-FIND("-", $A2,FIND("-",$A2)+1)))
				
				秒形式の経緯度をdd-mm-ssまたはddd-mm-ss形式に変換:
=INT(A2/3600) & "-" & TEXT(INT(MOD(A2,3600)/60),"00") & "-" & TEXT(MOD(A2,60),"00")
				
				dd-mm-ssまたはddd-mm-ss形式の緯度・経度を10進形式(dd.nnnnまたはddd.nnnn)に変換:
=LEFT(A2,FIND("-",A2)-1) + MID(A2,FIND("-",A2)+1,FIND("-",A2,FIND("-",A2)+1)-FIND("-",A2)-1)/60 + RIGHT(A2,LEN(A2)-FIND("-",A2,FIND("-",A2)+1))/3600
				
				日本測地系の緯度(10進形式)を世界測地系に変換する(C2/D2セルに10進形式の緯度/経度が格納されていることが前提):
=C2 - 0.00010695 * C2 + 0.000017464 * D2 + 0.0046017
				
				日本測地系の経度(10進形式)を世界測地系に変換する(C2/D2セルに10進形式の緯度/経度が格納されていることが前提):
=D2 - 0.000046038 * C2 - 0.000083043 * D2 + 0.01004
				
				時刻表などの時刻(例:10時36分⇒1036)を分数に変換する:
=INT(A2/100)*60 + MOD(A2,100)
				
			FileMaker Pro
FileMaker Proのスクリプトからシェルスクリプトを実行(macOS版)
# 単純に実行する場合
# →AppleScript記述にて
do shell script "~/bin/program.tcsh"
# フィールドの内容をシェルスクリプトの引数として実行する場合
# →計算済みのAppleScriptにて
"do shell script \"~/bin/program.tcsh " & GetAsText(テーブル名::フィールド名) & "\""
				
				FileMaker Proのスクリプトからバッチファイルを実行(Windows版)
# 単純に実行する場合
# →Eventを送信・テキスト記述にて
CMD /C c:\bat\program.bat
# フィールドの内容をバッチファイルの引数として実行する場合
# →Eventを送信・計算にて
"CMD /C c:\bat\program.bat " & GetAsText(テーブル名::フィールド名) & ""
				
				FileMaker ProのスクリプトからWSLのシェルスクリプトを実行(Windows版)
# 単純に実行する場合
# →Eventを送信・テキスト記述にて
WSL tcsh /home/bin/program.tcsh
# フィールドの内容をシェルスクリプトの引数として実行する場合
# →Eventを送信・計算にて
"WSL tcsh /home/bin/program.tcsh " & GetAsText(テーブル名::フィールド名) & ""
				
				コメント行:
#
				
			ffmpeg
動画ファイルの一部分を抽出する:
% ffmpeg -ss 00:08:26 -to 00:10:10 -i video.wma -c copy kirinuki.wma
				
				音声ファイルに1枚のサムネイル画像を付けて動画ファイルにする:
% ffmpeg -i thumbnail.png -i audio.wav -vcodec libx264 -pix_fmt yuv420p output.mp4
				
				複数の画像ファイル(ファイル名はスライド+数字.png)をスライドショーっぽい動画ファイルにする:
% ffmpeg -r 1/5 -i ./スライド%d.png -vcodec libx264 -pix_fmt yuv420p output.mp4 # 5秒間隔で表示
				
				複数(ここでは4つ)の画像ファイルをクロスディゾルブ/クロスフェードを使ってスライドショーっぽい動画ファイルにする:
% ffmpeg \
    -loop 1 -t 1.5 -i input1.png \
    -loop 1 -t 1.5 -i input2.png \
    -loop 1 -t 1.5 -i input3.png \
    -loop 1 -t 1.5 -i input4.png \
    -filter_complex \
        "[0:v]format=rgba[v0]; \
         [1:v]format=rgba[v1]; \
         [2:v]format=rgba[v2]; \
         [3:v]format=rgba[v3]; \
         [v0][v1]xfade=transition=fade:duration=0.5:offset=1[xf1]; \
         [xf1][v2]xfade=transition=fade:duration=0.5:offset=2[xf2]; \
         [xf2][v3]xfade=transition=fade:duration=0.5:offset=3[xf3]" \
    -map "[xf3]" \
    -r 30 -pix_fmt yuv420p output.mp4
				
				カラーバーを作成する:
% ffmpeg -f lavfi -i smptebars smpte.png
% ffmpeg -f lavfi -i smptehdbars smptehd.png
				
			find
カレントディレクトリ以下の.jpgファイルをホームディレクトリのworkディレクトリに移動する:
% find ./ -name \*.jpg -exec mv {} ~/work \;
				
				macOSからLinuxなどへコピーしたファイルに含まれる不可視(隠し)ファイルを抽出する:
% find ./ \( -name ".DS_Store" -or -name "._*" \) -ls
				
				カレントディレクトリ以下のファイルをタイムスタンプ+相対パスで表示する(bsd系):
% find . -print0 | xargs -0 stat -f '%Sm %N'
				
				.DS_Store や ._* のファイル名を除外してファイルを抽出する:
% find . -type f ! -name ".DS_Store" ! -name "._*" -print
				
			gawk(awk)
テキストファイルの3カラム目が空白でない行を表示する:
% gawk '$3 != ""' filename.txt        # 区切り文字はスペース
% gawk -F'\t' '$3 != ""' filename.txt # 区切り文字はタブ
				
			grep
階層検索:
% grep 'mogi' -r ./ --include "*.pl"
				
				複数ファイル検索時、ファイル名を表示しない:
% grep 'h1' -h *.html
				
				除外:
% grep 'mogi' *.tcsh | grep -v 'home'
				
				数字のみの行を除外する:
% grep -v '^[0-9]\+$' filename.txt
				
				OR検索:
% grep -e 'DCM' -e 'KDDI' -e 'SBM' filename.txt
				
				検索結果(マッチング部分)に色付けをする:
% grep 'mogi' --color=auto *.tcsh
				
				マッチング部分のみを表示する:
% grep -o 'boundary=[\!-z]\+' filename.txt
				
				検索結果に行番号を表示する:
% grep -n 'mogi '*.tcsh
				
				検索結果の前後の行も表示する:
% grep -3 'mogi' *.tcsh # 前後3行を表示する
				
				検索結果の前一行のみを表示する:
% grep -B 1 'mogi' filename.txt | awk '{print; getline; getline}'
# ただし、1行目に検索文字列がヒットした場合はうまく表示されない
				
				連続した2行がマッチングするかどうか($statusが0でマッチング):
% grep -A 1 'set c1="DCM"' program.tcsh | grep -q 'set c2="KDDI"'
% echo $status
				
				正規表現ではなく文字列として検索する:
% grep -F "[" filename.txt
				
			hdiutil(macOS固有)
ディスクイメージの情報を得る:
% hdiutil imageinfo filename.dmg
				
			head(tail)
テキストファイルの3行目をのみを表示する(3行以上あることが前提):
% head -3 filename.txt | tail -1 # sed -n '3p' filename.txt を推奨
				
			hexdump
16進ダンプとASCII文字を表示する:
% hexdump -C filename.dat
				
			ImageMagick(convert,magick)
画像ファイルに日本語の文字を挿入する(重ね合わせる):
# Windows版ImageMagickの例
> magick input-image.png -fill #595959 -font "Meiryo-&-Meiryo-Italic-&-Meiryo-UI-&-Meiryo-UI-Italic"
-pointsize 96 -gravity Center -annotate +0+50 "こんばんは" output-image.png
				
				等倍で拡大する(ぼやけないように拡大する):
% magick -scale 200% input.png output.png
				
				指定したサイズの中に画像を収める(下記例は1080x1920の縦長画像枠の中に縦横比を維持したまま画像を挿入する):
% magick input.jpg -auto-orient -resize 1080x1920\> -gravity center -background black -extent 1080x1920 output.png
				
			join
項目をキーとしてテキストファイルを結合する:
% join -t "," -1 1 -2 1 -o 1.1,1.2,2.2 master.txt transaction.txt
				
				※master.txt、およびtransaction.txtのキー(ここではどちらも1カラム目)は、あらかじめソートされていなければならない。
※タブ区切りにする場合は、\tではなく、そのままタブを入力する。入力できない場合は、<ctrl+v><tab>キーを押す。
ln
シンボリックリンクを張る:
% ln -s /home/mogi/bin bin
				
			mariadb
ユーザー・データベース作成、権限設定:
% vim createdb.sql
CREATE USER db_admin IDENTIFIED BY 'password' ;
CREATE DATABASE pdm DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ;
GRANT ALL PRIVILEGES ON pdm.* TO db_admin ;
FLUSH PRIVILEGES ;
% mariadb -u root -p
Enter password:
> \. createdb.sql
				
				タブ区切りテキストデータを一括インポートする:
% vim import.sql
LOAD DATA LOCAL INFILE "import_data.txt"
INTO TABLE parts_tbl
FIELDS TERMINATED BY '\t' ;
% mariadb pdm -u db_admin -p
Enter password:
> \. import.sql
				
				現在のデータベースを表示する:
> SELECT DATABSE() ;
				
				テーブルの構造を表示する:
> DESC parts_tbl ;
				
				テーブル一覧を表示する(Oracle DatabaseのUSER_TABLES相当):
> SHOW TABLES ;
				
				OSのコマンドラインからSQLを実行する:
% mariadb pdm -u db_admin -p < sqlfile.sql
Enter password:
				
			more
最終行を表示したらmoreを自動的に終了:
% ls -la | more -e
				
			nkf
SHIFT-JISからUTF-8へ、改行コードはLFに変換(旧MacやWindows→UNIX)。
UTF-8からSHIFT-JISへ、改行コードはCRに変換(UNIX→旧Mac)。
UTF-8からSHIFT-JISへ、改行コードはCRLFに変換(UNIX→Windows)。
SHIFT-JISからSHIFT-JISへ、改行コードはCRLFに変換(旧Mac→Windows)。
UTF-8からEUCへ、改行コードはLFに変換(UNIX→旧UNIX)。
% nkf -S -w -Lu filename_sjis.txt > filename_utf8_lf.txt
% nkf -W -s -Lm filename_utf8.txt > filename_sjis_cr.txt
% nkf -W -s -Lw filename_utf8.txt > filename_sjis_crlf.txt
% nkf -S -s -Lw filename_sjis.txt > filename_sjis_crlf.txt
% nkf -W -e -Lu filename_utf8.txt > filename_euc_lf.txt
				
				WindowsのSHIFT-JISからUTF-8へ、改行コードはCRLFに変換(Windows→新Windows)
WindowsのSHIFT-JISからUTF-8へ、改行コードはLFに変換(Windows→UNIX)
% nkf --ic=CP932 --oc=UTF-8 -Lm filename_cp932.txt > filename_utf8_crlf.txt
% nkf --ic=CP932 --oc=UTF-8 -Lu filename_cp932.txt > filename_utf8_lf.txt
				
				※注意:--ic=UTF-8を誤って--ic=UTF8(ハイフン抜き)と指定すると、エラーは表示されませんが、誤動作します。
HTMLの特殊文字(><”&)を&gt;&lt;&quot;&amp;に変換する:
% nkf -Z3 filename.html > filename_html.html
				
				MIMEデコード:
% echo "=?ISO-2022-JP?B?GyRCJU0lQyVIGyhC?=" | nkf -J -wm
ネット
% echo "=E3=83=8D=E3=83=83=E3=83=88" | nkf -W -wmQ
ネット
% echo "44ON44OD44OICg==" | nkf -W -wmB
ネット
				
			od
16進数で表示する:
% od -vtx1 mo.txt
				
			open(macOS固有)
EXCELのファイルをターミナル上から開きたい:
% open filename.xlsx # 関連付けされていることが前提
				
				PDFファイルをAcrobat Readerで開きたい:
% open -a "Adobe Acrobat Reader.app" filename.pdf
				
			osascript(macOS固有)
ダイアログを表示:
% osascript -e 'display alert "終了しました."'
				
				OKとキャンセルボタンのあるダイヤログを表示:
% osascript -e 'display dialog "進みますか?"'
				
				入力:
% osascript -e 'display dialog "間隔を入力してください." default answer "1"'
				
			pbcopy、pbpaste(macOS固有)
クリップボードへコピー:
% ls | pbcopy
				
				クリップボードからペーストする:
% pbpaste > clip.txt
				
			perl
標準入力:
while (<STDIN>) { # 変数$_に代入される
    chomp ;       # 変数名を指定しない場合は$_が対象
    print "読み込みデータは $_ です。\n" ;
}
				
				パターンマッチ:
if ($line =~ /茂木ネットワークセンター/) {
}
				
				パターンマッチした部分を抽出:
if ($line =~ /[!-z]*\.jpg/) {
    $fn = $& ;
}
$pattern = 'https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+' ;
while(<STDIN>) {
    if ($_ =~ /$pattern/gp) {
        print ${^MATCH} ;
    }
}
				
				パターンマッチからの文字列抽出:
# 午前・午後の時刻を抽出する(例:午後8:26)
($ampm, $hour, $minute) = $_ =~ /(午前|午後)(\d+):(\d+)/ ;
				
				文字列置換:
$line =~ s/茂木/mogi/g ; # 通常の置換
$line =~ s/<.*?>//g ; # HTMLタグを削除
$line =~ s/^\s*//; # 先頭のスペースを削除
$line =~ s/(http|https):\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?//g ; # URLを削除
$line =~ s/[\x{10000}-\x{3ffff}\x{40000}-\x{fffff}\x{100000}-\x{10ffff}]/\x{3013}/g ; # 絵文字を〓に置き換える
				
				文字列変換(大文字/小文字):
$str = uc $str ; # 大文字変換
$str = lc $str ; # 小文字変換
				
				ファイル書き込み:
open(OUT, ">", "filename.txt") ;
print OUT "茂木ネットワークセンター\n" ;
close(OUT) ;
				
				ファイル読み込み:
open(IN, "<", "filename.txt") ;
while (<IN>) {
    chomp ;
    print "読み込みデータは $_ です。\n" ;
}
close(IN) ;
				
				文字列分割(カンマ区切り):
$line = "mogi,2019,15" ;
@strlist = split(/,/,$line) ;
print "$strlist[0]\n" ;
print "$strlist[1]\n" ;
print "$strlist[2]\n" ;
$line = "mogi,2019,15" ;
($name,$year,$num) = split(/,/,$line) ;
print "$name\n" ;
print "$year\n" ;
print "$num\n" ;
				
				文字列分割例(カンマ、タブ、スペース、パイプ、垂直タブ、複数の区切り文字):
@strlist = split(/,/,$line) ;    # カンマ区切り
@strlist = split(/\t/,$line) ;   # タブ区切り
@strlist = split(/ /,$line) ;    # スペース区切り
@strlist = split(/\s+/,$line) ;  # 複数のスペースにも対応
@strlist = split(/\|/,$line) ;   # パイプ区切り
@strlist = split(/\x0b/,$line) ; # 垂直タブ区切り(FileMakerのフィールド内改行等)
@strlist = split(/:|;/,$line) ;  # コロン・セミコロン区切り
				
				文字列分割(一部のフィールドを無視。COBOLのDATA DIVISIONのFILLERみたいな感じ):
($name,undef,$num) = split(/\t/,$_) ;
				
				文字列分割時の要素数:
$line = "DCM,KDDI,SBM,RAKUTEN" ;
$strlist = split(/,/,$line) ;
print "$strlist\n" ;
				
				文字列結合・連結:
# 経度変換(DDD-MM-SSをDDD.MMSSにする)
$lon = "139-03-39" ;
$lon = substr($lon,0,3) . "." . substr($lon,4,2) . substr($lon,7,2) ;
# .= で結合する
$str = "MOGI " ;
$str .= "NETWORK " ;
$str .= "CENTRE\n" ;
print $str ;
# 文字列を繰り返し連結する
$str = "MOGI" x 3 ;
# 区切り文字付きで結合
$str = join(",",@strlist) ;
				
				16進数関係:
$code = 0xe21a ;        # 16進数を数値として変数に代入する
$code = hex("0xe21a") ; # 文字列の16進数を数値として変数に代入する
$code = hex("e21a") ;   # 文字列の16進数を数値として変数に代入する
printf("%X\n",$code)    # 16進数で表示する
				
				文字コード関係(Unicode):
use Encode ;
use utf8 ;
printf("%X\n",ord("あ")) ;                  # "3042"(Unicode)が表示される
print Encode::encode('UTF-8',chr(0x3042)) ; # "あ"が表示される
				
				文字コード関係(UTF-8):
$code = "\xe3\x81\x82" ; print $code ;      # "あ"が表示される
$code = pack("H*","e38182") ; print $code ; # "あ"が表示される
print unpack("H*", $code) ;                 # "e38182"が表示される
print uc(unpack("H*", $code)) ;             # "E38182"が表示される
				
				並び替え・ソート:
# 数値・昇順
@freq = (83.2, 80.3, 81.6, 85.1, 80.7, 82.5, 81.9) ;
@sorted = sort {$a <=> $b} @freq ;
print join(",",@sorted)."\n" ;
# 数値・降順
@freq = (83.2, 80.3, 81.6, 85.1, 80.7, 82.5, 81.9) ;
@sorted = sort {$b <=> $a} @freq ;
print join(",",@sorted)."\n" ;
# 文字列・昇順
@name = ('NHK', 'NTV', 'EX', 'TBS', 'TX', 'CX') ;
@sorted = sort {$a cmp $b} @name ;
print join(",",@sorted)."\n" ;
# 文字列・降順
@name = ('NHK', 'NTV', 'EX', 'TBS', 'TX', 'CX') ;
@sorted = sort {$b cmp $a} @name ;
print join(",",@sorted)."\n" ;
# アナログチャンネル順でソート
@channel = (
    [1,1,'G'],
    [2,3,'E'],
    [4,4,'NTV'],
    [5,10,'EX'],
    [6,6,'TBS'],
    [7,12,'TX'],
    [8,8,'CX']
) ;
@sorted = sort {$a->[1] <=> $b->[1]} @channel ;
foreach $str (@sorted) {
    print "@$str\n";
}
				
				文字列比較演算子:
if ($carrier eq "SBM")  { } # $carrierは"SBM"である
if ($carrier ne "KDDI") { } # $carrierは"KDDI"でない
				
				論理演算子:
if ($freq >= 76.0 && $freq <= 96.0) { }         # $freqが76.0から96.0の範囲の場合
if ($kind eq "DCM2.1" || $kind eq "DCM800") { } # $kindが"DCM2.1"または"DCM800"の場合
				
				文字列の書式:
$htmldatetime = sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00",2022, 3, 13, 8, 26, 0) ; # ゼロ埋め
				
				カンマ・ダブルクォーテーション・改行を含むCSVファイルを列に分離(http://www.din.or.jp/~ohzaki/perl.htmより拝借):
while (my $line = <DATA>) {
    $line .= <DATA> while ($line =~ tr/"// % 2 and !eof(DATA)) ;
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/ ;
    @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
        ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g) ;
}
				
				文字列からファイル名の抽出:
use File::Basename ;
$fn = "/home/mogi/bs.jpg" ;
$filename = basename($fn) ; # 拡張子を含むファイル名を抽出する
print "$filename\n" ;
				
				乱数の発生:
$a = int(rand(10)) ; # 0~9の乱数
$b = int(rand(10))+1 ; # 1~10の乱数
				
				乱数の初期化(N88-BASICのRANDOMIZE相当):
srand 12345 ;
				
				for構文:
for ($i = 0 ; $i <= 255 ; $i++) {
}
				
				foreach構文と配列:
@strlist = split(/,/,$_) ;
foreach $str (@strlist) {
    print "$str\n";
}
@strlist = split(/,/,$_) ;
foreach $str (@strlist[1..$#strlist]) { # 2番目の配列から最後まで
    print "$str\n";
}
				
				複数の配列:
@str = @field[1..7] # 2番目から8番目の配列
@str[1..3] = @field[3..5] ;
				
				ループ処理:
last ; # ループ処理を終了する・脱出する
next ; # 次のループに進む
				
				日付・時刻関係:
# 日付・時刻を利活用できるように変換する
use DateTime;
$dt = DateTime->new(
    year => 2022 ,
    month => 6 ,
    day => 17 ,
    hour => 8 ,
    minute => 26 ,
    second => 0 ,
) ;
# 曜日(省略形)、月(省略形)、日、時:分:秒、年(4桁)を表示する(MBOX形式のヘッダーのように)
print "From - " . $dt->strftime("%a %b %d %H:%M:%S %Y") . "\n" ;
				
				現在時刻を取得する:
use POSIX qw(strftime);
$current_time = strftime("%Y-%m-%d %H:%M", localtime());
				
				月の略称形式を数値に変換する:
$str = "Aug" ;
$month = (index 'JanFebMarAprMayJunJulAugSepOctNovDec', $str) / 3 + 1 ;
print "$month\n" ;
				
				引数:
$option1 = $ARGV[0] ; # 1番目の引数
$option2 = $ARGV[1] ; # 2番目の引数
($option1,$option2) = @ARGV ; # 上記と内容は同じ
				
				引数を使ったループ処理(引数の数が不定の場合など):
foreach $str (@ARGV) {
    print $str . "\n" ;
}
				
				サブルーチン:
# 秒数から緯度、経度に変換する
sub sec2latlon {
    my ($sec) = @_;
    my $hh = int($sec / 3600);
    my $mm = int(($sec % 3600) / 60);
    my $ss = $sec % 60;
    my $fmt = sprintf("%d-%02d-%02d",$hh,$mm,$ss) ;
    return($fmt);
}
				
				戻り値が複数あるサブルーチン:
# 緯度、経度を秒数に変換する
($y_sec,$x_sec) = &latlon2sec("36-23-15","139-03-49") ;
sub latlon2sec() {
    my ($lat,$lon) = @_ ;
    my ($y,$x) ;
    $y = substr($lat,0,2) * 3600 + substr($lat,3,2) * 60 + substr($lat,6,2) ;
    $x = substr($lon,0,3) * 3600 + substr($lon,4,2) * 60 + substr($lon,7,2) ;
    return($y,$x) ;
}
				
				OSコマンドの実行:
# リターンコード(実行ステータス)を取得する場合
$return_code = system("grep '^From ' filename.txt") ;
$return_code = $return_code >> 8 ;
print $return_code ;
# 実行結果を取得する場合
@str = `ls` ;
print @str ;
				
				色を付けて表示する:
use Term::ANSIColor ;
print color('red') ;
print "赤\n" ;
print color('reset') ;
print color('on_blue white') ;
print "反転青+白\n" ;
print color('reset') ;
				
				TAB区切りのデータを、固定長形式で出力する:
- タブ区切りの表をスペースを入れて整形する を参照。
 
標準入力より、HTMLファイル中のtable~/table間を抽出する:
while(<STDIN>) {
    print if /<table>/i .. /<\/table>/i;
}
				
				標準入力より、HTMLファイル中のa hrefやimgのリンク先やファイル名などを抽出する:
while(<STDIN>) {
    print "$1\n" while /<(?:img|a)\s+[^>]*?(?:src|href)\s*=\s*"([^"]+)"/gi;
}
				
				コマンドラインから文字列置換などを実行する:
% perl -pe 's/\s([0-9A-F])/\n\1/g' filename.txt > newfile.txt
				
			perl+sqlite3
PerlからSQLiteの利用ドキュメント:
PerlからSQLiteを使用するためのサンプルコード:
# データベース使用宣言・データベース接続
use DBI;
$dbh = DBI->connect("dbi:SQLite:dbname=./code.db") ;
# テーブル削除後、作成
$dbh->do("DROP TABLE IF EXISTS code_tbl") ;
$dbh->do("CREATE TABLE code_tbl (kanjicode, unicode, utf8)") ;
# タブ区切りのテキストファイルからデータを読み込み、テーブルに挿入する
open(IN, "<", "./code.txt") ;
while ($line = <IN>) {
    chomp $line ;
    ($in_kanjicode, $in_unicode, $in_utf8) = split(/\t/,$line) ;
    $dbh->do("INSERT INTO code_tbl (kanjicode, unicode, utf8) VALUES ('$in_kanjicode', '$in_unicode', '$in_utf8');");
}
close(IN);
# 特定のデータを1件のみ抽出して表示する
$str = "8160" ;
($rst_kanjicode, $rst_unicode, $rst_utf8) 
    = $dbh->selectrow_array("SELECT kanjicode, unicode, utf8 FROM code_tbl WHERE kanjicode = '$str';") ;
if (defined $rst_kanjicode) {
    print "検索結果→$rst_kanjicode,$rst_unicode,$rst_utf8\n" ;
}
# 複数レコードを抽出して表示する
$sth = $dbh->prepare("SELECT kanjicode, unicode, utf8 FROM code_tbl ORDER BY unicode;") ;
$sth->execute() ;
while (@row = $sth->fetchrow_array) {
    ($out_kanjicode, $out_unicode,$out_utf8) = @row ;
    print "$out_kanjicode,$out_unicode,$out_utf8\n" ;
}
# データベース接続を終了する
$dbh->disconnect;
				
			python
タブ区切りのテキストファイルを一行ごとに読み込み、既存のEXCELワークシートに書き込む:
import openpyxl
# ファイル名を指定する
txt_filename  = 'base_station.txt'
xlsx_filename = 'base_station.xlsx'
# 既存のEXCELファイルを開く
workbook = openpyxl.load_workbook(xlsx_filename)
sheet = workbook.active
# テキストファイルを行ごとに読み込み、EXCELワークシートに書き込む
with open(txt_filename, 'r') as file:
    # EXCELワークシートの2行目から書き込む
    row_num = 2
    for line in file:
        # 行をタブで分割して、3つのフィールドに分ける
        fields = line.strip().split('\t')
        # フィールドをA列、B列、C列に追加する
        sheet.cell(row=row_num, column=1, value=fields[0])
        sheet.cell(row=row_num, column=2, value=fields[1])
        sheet.cell(row=row_num, column=3, value=fields[2])
        row_num += 1
# EXCELファイルを保存し、閉じる
workbook.save(xlsx_filename)
workbook.close()
				
				Unicode文字列をNFKC(互換正規化)で処理する:
import sys, unicodedata as u
print("".join(u.normalize("NFKC", l) for l in sys.stdin), end="")
				
				標準入力をCP932コード順でソートする:
import sys
lines = [l.rstrip("\n") for l in sys.stdin]
print("\n".join(sorted(lines, key=lambda s: s.encode("cp932"))))
				
			rm
スペースを含むファイル名を削除:
% rm "2022年 計画書.txt"
				
				ハイフンで始まるファイル名を削除:
% rm ./-a
				
			screencapture(macOS固有)
画面のスクショ(スクリーンショット)を行う:
% screencapture filename.png # 全画面
% screencapture -D 2 filename.png # マルチモニター環境において、2番目のモニターの全画面が対象
				
			sed(BSD系)
1行目の行頭のコメントを削除する:
% sed -i '' '1s/^#//g' filename.ini
				
				全ての行頭の二重コメントを削除する:
% sed -i '' 's/^##//g' filename.ini
				
				3行目を表示する:
% sed -n '3p' filename.ini
				
				初期設定ファイルなどのパラメータを書き換える:
% sed -i '' 's/^autoboot_delay=.*/autoboot_delay="-1"/' filename.ini
				
				改行のみの行を削除する:
% sed -i '' '/^$/d' filename.txt
				
				ハイフンが存在せず、ピリオドが存在する行の先頭に■を付与する(見出しなどで、8-26.はそのまま、8.は■8.にしたい場合など):
% sed '/-/! { /\./ s/^/■/; }' filename.txt
				
			sort
文字コード順でソート:
% setenv LC_ALL C
% sort filename.txt
				
				文字コード順でソート(スリムな方法):
% cat filename.txt | env LC_ALL=C sort
				
				英字は大文字小文字の区別を付けないでソート:
% setenv LC_ALL C
% sort -f filename.txt
				
				2列目が数字のテキストファイル(区切り文字はタブ)で降順にソート:
% sort -k 2 -n -t "\t" -r filename.txt
				
			sqlite3
テーブル構造、インデックスの表示(Oracle Databaseのdescやuser_tables、user_indexesなどに相当):
> .schema
				
				sqlite3を終了する:
> .q
				
				左表のデータは全部、右表の一致データだけを結合(LEFT JOIN):
> SELECT c.cp932, c.unicode, e.eaw FROM code_tbl c LEFT JOIN eaw_tbl e ON c.unicode = e.unicode ;
				
				GROUP BYの際に文字列を連結する:
# カンマ区切り
> SELECT pref,GROUP_CONCAT(name) FROM master GROUP BY pref;
# セミコロン区切り
> SELECT pref,GROUP_CONCAT(name,';') FROM master GROUP BY pref;
				
				今日の日付・現在の時刻を得る:
> SELECT STRFTIME('%Y-%m-%d', CURRENT_TIMESTAMP, 'localtime'), STRFTIME('%H:%M', CURRENT_TIMESTAMP, 'localtime') ;
				
				日付を数値に変換する:
> SELECT JULIANDAY('2022-12-08') ;
				
				OSのコマンドラインからSQLを実行する:
% sqlite3 database.db < sqlfile.sql
				
				タブ区切りのデータをインポートするSQL文の例:
% vi sqlfile.sql
DROP TABLE IF EXISTS master;
CREATE TABLE master ( code INTEGER, pref TEXT );
.mode tab
.import pref.txt master
.quit
% sqlite3 database.db < sqlfile.sql
				
				SELECT時の区切り文字をtabにする:
.mode tab
				
				SELECT時の区切り文字をスペースにする:
.separator " "
				
				SELECT結果をファイルに保存する(Oracle SQL*PlusのSPOOL相当):
.output filename.txt
SELECT * FROM master;
				
				SELECT結果を画面表示に戻す:
.output stdout
				
				シングルクォーテーションのエスケープ処理:
INSERT INTO master(memo) VALUES('User''s') ;
				
			strings
バイナリーファイル中のテキスト文字を抽出する:
% strings filename.webloc | grep http
% strings -td filename.textclipping | grep DOCTYPE # Debianのstringsコマンド
				
			tail
テキストファイルを逆順で表示する:
% tail -r filename.txt
				
				2行目以降を表示する:
% tail -n +2 filename.txt
				
			tcsh、共通コマンド
引数チェック:
if ($#argv == 2) then
    if (${argv[1]} == "secret") then
        set option = "secret"
    else if (${argv[1]} == "normal") then
        set option = "normal"
    else
        echo "usage: filename.tcsh <normal|secret> <number>"
        exit 1
    endif
else
    echo "usage: filename.tcsh <normal|secret> <number>"
    exit 1
endif
				
				日付・時刻:
set yyyymmdd = `date '+%Y-%m-%d'`
set hhmmss   = `date '+%H:%M:%S'`
				
				テキストファイルの中身を変数に設定:
set yyyymmdd = `cat date.txt`
set hhmmss   = `cat time.txt`
				
				キー入力を待つ(下記の例はMS-DOSバッチファイルのPAUSEに相当)※厳密にはbashのreadコマンド:
read -n 1 -p "Press any key to continue ..."
				
				キー入力を待つ(入力が無い場合でもタイムアウトさせる場合)※厳密にはbashのreadコマンド:
read -t 5 -n 1 -p "Press any key to continue ..."
				
				Enterキーが押されるまで待つ:
set input=$<
				
				foreach構文:
foreach filename (${argv[2-$#argv]})
    echo ${filename}
end
foreach filename (`ls`)
    echo ${filename}
end
				
				パス名・ファイル名の取得:
set fn="/home/mogi/filename.txt"
echo $fn:h   # パス名のみ
echo $fn:t   # ファイル名+拡張子
echo $fn:e   # 拡張子のみ
echo $fn:r   # 拡張子を除く
echo $fn:t:r # ファイル名のみ
				
				シェル自身のファイル名を変数として利用する:
set fn="$0:t:r" # ファイル名の部分のみ
				
				直前のディレクトリに戻る:
% cd -
				
				ディレクトリを記憶しながら移動する:
[/tmp] % pushd /home/bin
[/home/bin] % popd
[/tmp] %
				
				階層途中のディレクトリも作成する:
% mkdir -p backup/bin
				
				ヒストリーの削除:
% history -c
				
				色を付けて表示する:
% printf "\033[35mパープル\033[m"
% printf "\033[37;40m白文字+黒反転\033[m"
				
			tee
管理者権限でファイルに文字列を追加する(FreeBSDなど):
% echo "$str" | sudo tee -a /etc/rc.conf
				
			touch
ファイルのタイムスタンプを設定する:
% touch -t 202508261200 filename.txt
				
			tr
改行コードをCRからLFに変換する(旧Mac→UNIX):
% tr '\r' '\n' < filename.txt > newfile.txt
				
				改行コードをCR+LFから、LFに変換する(Windows→UNIX):
% tr -d '\r' < filename.txt > newfile.txt
				
				垂直タブを改行に変換する:
% cat filename.txt | tr '\013' '\n'
				
			vim
閲覧時のエンコーディング切り替え(SHIFT-JIS、EUC、UTF-8)
:e ++encoding=sjis
:e ++encoding=euc-jp
:e ++encoding=utf8
				
				.vimrc(タブ4文字分、改行コード自動認識、検索時大文字小文字の区別なし、ルーラ表示、検索結果をハイライト、ソースコードを色分ける)
"コメント行はダブルクォーテーション
set tabstop=4
set shiftwidth=4
set fileformats=unix,dos,mac
set ignorecase
set ruler
set hlsearch
syntax on
				
				範囲指定してインデント変更:
v
範囲指定
>
				
				改行を句点に置き換える(改行の削除):
:1,$s/\n/、/g
				
				句点を改行に置き換える(改行の挿入):
:s/、/\r/g
				
				ソート(通常、大文字/小文字区別無し、重複削除、数字):
:sort
:sort i
:sort u
:sort n
				
				便利なコマンド(行番号の表示/非表示、改行・タブの表示/非表示、検索結果のハイライト/非表示):
:set number
:set nonumber
:set list
:set nolist
:set hlsearch
:set nohlsearch
				
				ウインドウの分割、移動:
画面分割:<CTRL+W><CTRL+S>
ウインドウ間移動:<CTRL+W><CTRL+W>
				
				ファイルの編集、カーソル位置へのファイルの挿入:
:e finame.txt
:r finame.txt
				
				空白行(改行のみの行)を削除する:
:g/^$/d
				
				先頭の空白(スペース、タブ)を削除する:
:%s/^\s\+//
				
				連続するスペースをタブに置き換える:
:%s/ \+/\t/g
				
				2行を1行に(偶数行を奇数行に)区切り文字,で連結する:
:g/^/ normal Jxi,
				
				行番号を指定して起動する:
% vim +256 filename.txt
				
				同じ文字(テキスト)を指定した回数分、繰り返し入力する:
32i-<ESC>
				
				undoのやり直し:
<CTRL+R>
				
				対応するカッコに移動する:
%
				
				カーソル位置の文字コード(UNICODE)を表示する:
ga
				
				カーソル位置の文字コード(UTF-8)を表示する:
g8
				
				カーソル上の単語を検索する:
*
				
				文字列検索をし、その結果を一覧で確認し、該当の行へジャンプする:
% vim +":vimgrep /検索文字列/ filename.txt" +copen  # 単一ファイル
% vim +":vimgrep /検索文字列/ *.txt"        +copen  # 複数ファイル
% vim +":vimgrep /検索文字列/ **/*.txt"     +copen  # 階層を追って複数ファイル
				
				※Enterで該当行へジャンプ、CTRL+Wでウインドウ間切り替え。
xargs
プロセスが暴走した時に一気にkillする:
% ps -ax | grep "xterm" | awk '{print $1}' | xargs kill
				
			xxd
ファイルを16進ダンプする(閲覧用):
% xxd filename.bin
				
				ファイルを16進ダンプに変換する:
xxd -p filename.bin > filename.hex
				
				16進ダンプをバイナリーに変換する:
% echo e88c82 | xxd -r -p > mo.txt
				
			wine
Wineで起動中のWindowsアプリから、UNIX上のプログラムを起動する:
cmd /c start /unix /home/bin/program.tcsh
				
			wc
テキストファイル中の文字数をカウントする(マルチバイト文字対応):
cat filename.txt | tr -d '\n' | wc -m # 改行をカウントしてしまうのでtrコマンドで削除している
				
			テキストファイルからビットマップ画像を作成する
テキストファイルからビットマップ画像を作成する:
% vim sample.xpm
/* XPM */
static char *XPM_X[] = {
/* columns rows colors chars-per-pixel */
"32 8 5 1",
"p c #c8bef7",
"r c #f6bde6",
"o c #f7e0b0",
"g c #c7f7e5",
". c None",
/* pixels */
".pp...pp..rrrrr....ooooo.gggggg.",
".ppp.ppp.rr...rr..oo.......gg...",
".ppppppp.rr...rr.oo........gg...",
".ppppppp.rr...rr.oo..ooo...gg...",
".pp.p.pp.rr...rr.oo...oo...gg...",
".pp...pp.rr...rr..oo..oo...gg...",
".pp...pp..rrrrr....ooooo.gggggg.",
"................................"
};
% convert sample.xpm sample.png
				
				補足:
- あらかじめImageMagickをインストールしておくこと。
 - OS環境によっては、convertではなくmagickコマンドの場合がある。
 - GraphicConverterでも変換可能。
 
バッチファイル(DOS/Windows)
バッチファイルで実行したコマンドを画面に表示させない。通常はバッチファイルの先頭行に記載する。
@ECHO OFF
				
				文字を表示する:
REM 文字を表示する
ECHO HELLO WORLD.
REM 空白行を表示する(ECHOの後にスペースを入れない)
ECHO.
				
				バッチファイルを終了する:
EXIT
				
				何かキーが押されるまで待つ:
PAUSE
				
				コメント行:
REM --------
REM  メイン
REM --------
				
				変数の代入:
SET home=c:\home\user\mogi
SET bin="C:\Program Files\program\program.exe"
SET arg1=%1
				
				文字入力:
SET ans=
SET /P ans="よろしいですか?(y/n)="
IF %ans%==y (
    ECHO 了解しました.
)
				
				ファイルの中身を変数に代入する(最初の一行のみ):
SET /P url=<c:\home\user\mogi\websiteurl.txt
				
				バッチファイル、アプリケーションなどを起動する:
REM c:\windowsフォルダーを開く
START c:\windows
REM .htmlファイルを開く
START c:\home\user\mogi\index.html
REM .pdfファイルを開く
START c:\home\user\mogi\file.pdf
REM .txtファイルを開く
START c:\home\user\mogi\file.txt
REM URLを開く
START https://moginwc.sakura.ne.jp
REM 変数に設定されたURLを開く
SET url=https://moginwc.sakura.ne.jp
START %url%
				
				WSLのシェルスクリプトを実行:
REM シェルスクリプトを実行
WSL tcsh /home/user/mogi/program.tcsh
REM 引数付きでシェルスクリプトを実行する
WSL tcsh /home/user/mogi/program.tcsh DCM800
				
				クリップボード:
REM クリップボードへコピー
DIR | CLIP
REM クリップボードからペースト
powershell -command "get-clipboard"
				
			秀丸マクロ
現在の日付と時刻を挿入する(YYYY-MM-DD HH:MI形式)。
insert year + "-" + month + "-" + day + " " + hour + ":" + minute ;
endmacro;