openssl rand 3*1024 | openssl dgst -sha256 | sed "s/(stdin)= //" 【解説】 ・まず openssl rand で 3kb のバイナリファイルを作成し、またパイプを通して openssl dgst -sha256 でダイジェストを生成する、最後に sed で (stdin)=を除けば、 いろいろなプログラミング言語で 変数に代入できます。 例えば、shell の場合: dgst=openssl rand 3*1024 | openssl dgst -sha256 | sed "s/(stdin)= //" echo $dgst 【出力例】f142f690487be57f5ce41f71a3ae1c3928a8ecc1bc2b06e2e33c8363673d3c22
Category Archive: shell
awk で awk を作る!
例えば、201404-201406 の DPC EFファイルがありました。
1 2 3 4 5 6 7 |
myserver@myuser:/home/myuser$ ls -l EFn*.txt -rwxrw-rw- 1 nobody nogroup 167814285 7月 22 10:39 EFn_123456789_1404.txt -rwxrw-rw- 1 nobody nogroup 172074188 7月 22 10:56 EFn_123456789_1405.txt -rwxrw-rw- 1 nobody nogroup 186567502 7月 22 11:10 EFn_123456789_1406.txt -rwxrw-rw- 1 nobody nogroup 198716381 10月 15 19:19 EFn_123456789_1407.txt -rwxrw-rw- 1 nobody nogroup 189570039 10月 17 10:42 EFn_123456789_1408.txt -rwxrw-rw- 1 nobody nogroup 181837707 11月 11 12:46 EFn_123456789_1409.txt |
これらのファイルの先頭に年月(YYYYMM)と tab を追加したい場合は、下記の awkでいけます。
1 2 3 4 5 6 |
awk '{ print "201404 ","\t",$0 }' EFn_123456789_1404.txt > YM_EFn_123456789_1404.txt awk '{ print "201405 ","\t",$0 }' EFn_123456789_1405.txt > YM_EFn_123456789_1405.txt awk '{ print "201406 ","\t",$0 }' EFn_123456789_1406.txt > YM_EFn_123456789_1406.txt awk '{ print "201407 ","\t",$0 }' EFn_123456789_1407.txt > YM_EFn_123456789_1407.txt awk '{ print "201408 ","\t",$0 }' EFn_123456789_1408.txt > YM_EFn_123456789_1408.txt awk '{ print "201409 ","\t",$0 }' EFn_123456789_1409.txt > YM_EFn_123456789_1409.txt |
しかし、ファイルが多い場合、上記のコマンドを手入力するのは間違いやすいし、大変労力が要る作業になります。 もちろん、Excelを使えば、201404のところを列にして、マウスポインターで引っ張ると201409列まで作って、 後はできた内容をテキストエディタへコピーして、tab を space に置換えすれば、できないことはありません。 というか、いままで良くExcelの方法でやって来ました。 では、awk ならどうなるかというと下記の一行コマンドで上記6行のコマンドを作り出せます。簡単でしょう!!!
1 2 |
myserver@myname:/home/myname$ ls -l EFn*.txt | awk '{print "awk \047{ print \"20" substr($9,15,4) " \",\"\\t\",$0 }\047 " $9 " > YM_" $9}' > add_YM.sh myserver@myname:/home/myname$ bash add_YM.sh |
簡単に説明しましょう。 まず ls -l して、ファイルの一覧を出力します。すると9番目のカラム($9、OSによって異なる場合もある)はファイル名になります。 ファイル名から substr関数で 15文字目から4文字を取得します。 後は、\047でシングルクォーテーションすれば、完成です。 (ダブルクォーテーションは \" でエスケープします)
一行コマンド ファイル一覧
データ処理した途中の履歴ファイルの一覧を出すため、 この一行で出せます。 ls -l section_structure_*.csv |awk '{print $9}' section_structure_1341980953.csv section_structure_1341999986.csv section_structure_1342001339.csv section_structure_1342060694.csv section_structure_1342061705.csv section_structure_1342066473.csv section_structure_1342066838.csv section_structure_1342067415.csv section_structure_1342067939.csv section_structure_1342068406.csv section_structure_1342069234.csv section_structure_1342070617.csv section_structure_1342071515.csv section_structure_1342072417.csv section_structure_1342073485.csv
一行コマンド ログファイルのコピー
ls -tl /var/log/apache2 | grep -e "05-25" | awk '{print "sudo cp /var/log/apache2/"$8 " ."}' > test.sh ; sh test.sh いまのディレクトリに apache2 の5月25日に更新されたログファイルをコピーする。 あるいは、 ls -tl /var/log | grep -e "May 25" | awk '{print "sudo cp /var/log/"$9 " ."}' > test.sh ; sh test.sh