ラベル shell の投稿を表示しています。 すべての投稿を表示
ラベル shell の投稿を表示しています。 すべての投稿を表示

2022/02/24

いま生まれて何日目で平均寿命まであと何日で人生はあと何割残っているのか表示されるコマンド

今日の昼休みに作った。コマンド名は「yomei.sh」だ。生年月日と平均寿命(目標年齢でもOKよ)を渡すと平均寿命までのカウントダウンを表示してくれる。
% ./yomei.sh 2000/02/02 82
会社のPCを起動するとシェルが自動起動するんだけど、そのときに表示されるようにしてみた。表示してみたはいいけど、なんか嫌な感じ・・・
人生 29930 日のうち 8058.79 日が使用済みです。(26.92%)
82歳になる 2082年01月12日(月) まであと 21871.20 日 (残り73.08%)
==========================--------------------------------------------------------------------------
これ↓を流用した。ソースは雑すぎてこっ恥ずかしいので非公開だ。
そもそも起動時に1年の何割が経過したのか表示しているので、起動時にさらにごちゃごちゃ表示される。
これが
2022.02.24(木) 18:51 08週 055日 [15%]
===============-------------------------------------------------------------------------------------
こうなった
2022.02.24(木) 18:51 08週 055日 [15%]
===============-------------------------------------------------------------------------------------
人生 29930 日のうち 8058.79 日が使用済みです。(26.92%)
82歳になる 2082年01月12日(月) まであと 21871.20 日 (残り73.08%)
==========================--------------------------------------------------------------------------

2021/11/08

カレントディレクトリ以下のすべてのファイルの作成日時を更新日時にしたかったpowershell

powershellなかなか便利だな。でもこれ書くのに30分くらいかかった。set-itemproperty $_.FullNameとget-itemproperty $_.FullNameのところで書き方がわからず、エラー内容もちょっと意味不明だったのよ、初心者のわいからすると。
get-childitem -path .\ -recurse | where-object { $_ -is [System.IO.FileInfo] } | foreach-object { set-itemproperty $_.FullName -Name CreationTime -Value (get-itemproperty $_.FullName).LastWriteTime }

既存の数値フォルダ名を0埋めしたフォルダ名リストが欲しかったpowershell

shellscriptならこんな感じですぐ書けるけど
% for DIRNAME in $(ls);do;printf "%010d\n" $DIRNAME >>folderlist.txt ;done;
# or
% ls | tr ' ' '\n' | xargs printf "%010d\n" >folderlist.txt
powershellは慣れていないので、これを書くのに20分くらいかかった。
dir|select-object Name|foreach-object{($_.Name -as [string]).padleft(10, '0')} >folderlist.txt

2021/10/19

空ファイル empty 生成 コマンド

すぐ忘れるのでメモ。
dd if=/dev/zero of=123.dmp bs=1M count=10
dd if=/dev/urandom of=123.dmp bs=1M count=10

2020/03/06

orgファイルをコマンドラインでhtml変換エクスポート

#!/usr/bin/sh
emacs "$1" --batch -f org-html-export-to-html --kill
「--」とか「:」を文面として記載したいときに[[--]]とか[[:]]で書いてたんだけど、「Unable to resolve link」ってエラーで変換できなくなってしまっていた。エスケープ方法をググったけどわからず。公式ドキュメントも探ってみたけど迷子になった。取り急ぎ「 : 」「 -- -- 」と記載した。正しくないからなんとかしたいけど。

 

2020/01/28

Windowsコマンドライン MD5ハッシュ

WindowsのコマンドラインでもMD5ハッシュ簡単に確認できるんだな。cygwinでmd5sum使ってた。出先環境で使えるから覚えておこう。

certutil -hashfile <ファイルパス> [ハッシュアルゴリズム]
C:\Users\valvallow\Desktop>certutil -hashfile bin.zip MD5
MD5 ハッシュ (対象 bin.zip):
222eb0a3583c4e0ef48e5900d53f373e
CertUtil: -hashfile コマンドは正常に完了しました。

2019/10/08

ポートが開いてるか?telnetコマンドを使う以外の確認方法を知らなかった。



この際telnet以外で確認する方法を調べておく。実際よく客先とかでtelnetが入ってなくて困るので。
まずtelnetで確認する方法。指定ポートにつながらなければ接続できなかったメッセージが表示される。
C:\Users\valvallow>telnet google.com 80
接続中: google.com...
C:\Users\valvallow>telnet google.com 12345
接続中: google.com...ホストへ接続できませんでした。 ポート番号 12345: 接続に失敗しました

以下、いま調べてみた方法。まずはftpコマンドで確認する方法。(でもftpコマンドも最近のwindowsは初期状態だとOFFだよね)
C:\Users\valvallow>ftp
ftp> open google.com 80
google.com に接続しました。
ftp> open google.com 12345
>ftp: connect :接続がタイムアウトしました

次に、PowerShellで確認する方法。PowerShellなら標準で入ってるから良いかも。test-netconnectionコマンドレットを使う。test-netconnectionはtncでもいいらしい。
PS C:\Users\valvallow> test-netconnection google.com -Port 80


ComputerName     : google.com
RemoteAddress    : 216.58.197.206
RemotePort       : 80
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.1.1
TcpTestSucceeded : True
PS C:\Users\valvallow> test-netconnection google.com -Port 12345
警告: TCP connect to (216.58.197.206 : 12345) failed


ComputerName           : google.com
RemoteAddress          : 216.58.197.206
RemotePort             : 12345
InterfaceAlias         : イーサネット
SourceAddress          : 192.168.1.1
PingSucceeded          : True
PingReplyDetails (RTT) : 23 ms
TcpTestSucceeded       : False

他に方法あるのかなぁ。

2019/08/01

shellscript fizzbuzz

shellscriptで書いたFizzBuzzについて、いろいろ教えてもらった。


yes|nl|cut -f1なんていらんかったんやw

seq inf | awk '{a=""; if($0%3==0){a=a "Keisuke"} if($0%5==0){a=a "Honda"} print a?a:$0}'
yes | awk '{a=""; if(NR%3==0){a=a "Keisuke"} if(NR%5==0){a=a "Honda"} print a?a:NR}'

驚いたのはむしろこっち。
a=""; if($0%3==0){a=a "Keisuke"} if($0%5==0){a=a "Honda"} print a?a:$0
3で割り切れたらaには"Keisuke"が入って、さらに5でも割り切れたらaに"Honda"を追記してんのね。a?a:$0は三項演算子で先頭のaがboolとして動いてて中身が入ってればtrue扱いなわけですか。おもろー。


 
seq inf | awk 'a="";$1%3==0{a=a"fiz"}$1%5==0{a=a"buz"}{print a?a:$1}'


2018/12/11

shellで基数変換 2進数、8進数、16進数、36進数



いままでbcコマンド(ibase,obase)のお世話になることが多かった。でもbcコマンドは16進数までしか変換できないんだよね。
調べてみたら、zshやbashで基数変換できるらしい。

% echo $((36#99))
333

ところが、調べてみてもinとoutを指定して基数変換する方法がわからない。できないんだろうと思っていたんだけど、やり方を教えてもらえました。これどこに載ってんの?きっと公式ドキュメントのどこかに載っているんだろうなぁ・・・。

追記:ここに載っている



% echo $(([#36] 10#333))
36#99

こりゃ便利。10進数 → 36進数とか36進数 → 10進数とか、わりと仕事で必要になるんだ。あ、64進数はダメなのね。


2018/04/23

いま今年の何%経過した?

こういうやつ Year Progress(@year_progress)さん | Twitter
実行するとこんな感じになる。
■■■■■■■■■■■■■■■■■■■■■□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□ 21%

追記(とある方より)
追記追記(「date +%jでとれるのね」)
末尾の%を除いてfoldすると
% seq 0 99 | sed -e 's/.*/_/g' -e "1,$(echo $(date +%j)/3.65 | bc)s/.*/X/g"  | tr '\n' ' ' | tr -d ' ' | fold -w 10

XXXXXXXXXX
XXXXXXXXXX
X_________
__________
__________
__________
__________
__________
__________
__________ 

接続履歴のある無線LANパスワードを表示する

netshで表示できるのでcygwinからコマンドで確認できるようにした。
こういうほんのちょっと便利になる小さなshell scriptを書いてる時が一番楽しい。笑
しかし、shell scriptのデバッグはtypoとの戦いだわ。

2016/05/18

gitサーバにssh接続して特定のディレクトリ配下にあるgitリポジトリを片っ端からcloneまたはpullするshell script

掲題の通りです。gitリポジトリのバックアップに使おうと思って書きました。expectコマンドは使ったことがなかったので、それなりにハマりつつ書きました。いい加減な作りなので使う人は気をつけてね☆
gitのhookでバックアップ用のremoteにpushする手も考えましたが、リポジトリが増えるごとにメンテがいる気がしたのでやめました。メンテは0にしたい。
会社のリポジトリはすべて社内サーバの特定ディレクトリ配下にあるので「ssh接続して検索、すでに知ってるリポジトリであればpull、新しく見つかったらcloneするマン」を用意すれば楽だなって。cronで実行すればほったらかしで済むし、メールで飛んでくるcronのログさえ見てればOKだし。
  1. gitサーバにssh接続してgitリポジトリをfind (サブディレクトリも)
  2. 対象リポジトリのリストを作成 (ファイルにする必要はないけど特に何も考えてない)
  3. 新しいリポジトリならディレクトリ階層も再現しつつclone、そうでなければpull

2016/05/06

zsh + screen + ssh-agent

.zshrcの後半に下記を追記した。ちなみにgnu screenはいつも手動起動している。
 if [ 0 -eq $(ps ax | grep ssh-agent | wc -l) ]
 then
     eval $(ssh-agent)
     ssh-add .ssh/hoge/id_rsa
 fi
 
 TRAPEXIT()
 {
     if [ 0 -eq $(ps ax | grep screen | wc -l) ]
     then
         eval $(ssh-agent -k)
     fi
 }

2016/04/30

社内と社外でssh接続先のHostを自動的に切り替える

出張が多いです。出張先でgit pullするときに.ssh/configを書き換えて社内に戻ったらまた.ssh/configを書き換えて・・・っていう運用がいい加減めんどう過ぎました。.ssh/configにはmatch構文があるそうでshanaidesuka.shコマンドを作ってssh接続先が自動的に変わるようにしました。

shanaidesuka.shは社内無線LANのアクセスポイントにつながっているかどうか判定するだけのコマンドです。

2015/02/04

ログファイル先頭にファイル名挿入

more `find ./` > for_print.txt
これすげーな。この発想はないわ。
結局こうしたけど。
valvallow@x1 ~/desktop/error
% for file in *.*; do; sed -i "1s/^/$file\n\n/" $file; done;

2014/09/12

sshポートフォワーディング + リモートデスクトップ → OpenVPN

これまで出張先から会社の環境で開発するときはSSH+リモートデスクトップだった。OpenVPN環境ができたので、それも必要なくなった。それに社内に居る時と社外に居る時で~/.ssh/configを書き換えてたけど、それも不要になった。便利。

2014/08/19

{ }で囲んだ処理をパイプ

知らなかった。
valvallow@x1 ~ % { echo hoge ; echo fuga ; echo piyo ; }
hoge
fuga
piyo

valvallow@x1 ~ % { echo hoge ; echo fuga ; echo piyo ; } | sed 's/o/a/g'
hage
fuga
piya

valvallow@x1 ~ % { echo hoge ; echo fuga ; echo piyo ; } | sed 's/o/aaaaaaaaaaaaa/g'
haaaaaaaaaaaaage
fuga
piyaaaaaaaaaaaaa

2013/11/21

シェルスクリプト総合 その22

((--i)) でiが0になる時、返り値1なんだ。 
iが負の値になる時でも返り値0なのに、0になる時だけ特別なんですね。

へぇー!こうか。

% i=10; while ; echo $i; ((--i)) && sleep 1s ; do; done;
10
9
8
7
6
5
4
3
2
1
27 :名無しさん@お腹いっぱい。:2013/11/20(水) 19:52:35.18
一定時間、何度か繰り返しコマンドを実行したくて、

for i in `seq 1 10`
do
 何かのコマンド
 sleep 1h
done
echo "finished" | write username

といったスクリプトを書いているのですが、このやり方だと
最後にコマンドを実行してから一時間、無駄に sleep してしまいます。
最後の sleep だけ実行しない方法はないでしょうか。

28 :名無しさん@お腹いっぱい。:2013/11/20(水) 19:58:50.00
再編集の時が恐いけど
変数 i<=9 のときにsleep 1h

i/=10の時に sleep 1h

29 :名無しさん@お腹いっぱい。:2013/11/20(水) 20:00:40.20
>>27

i=10
while
 何かのコマンド
 ((--i)) &amp;&amp; sleep 1h
do :; done
echo "finished" | write username

30 :27:2013/11/20(水) 20:07:56.43
おお! 素早い回答、ありがとうございます。
ですが、たびたびすいません。

実際に使っているスクリプトだと、ループの実行回数が不定な場合があるのです。
(行数が特定できないファイルからの読み込みとか)
最後のループでは sleep しない、という手段はあるでしょうか。

31 :27:2013/11/20(水) 20:19:58.58
よく考えたらファイルからの読み込みも終了判定できますね。
何とか工夫すれば、判定できないループってないかも……。
どうもお騒がせしました。

32 :名無しさん@お腹いっぱい。:2013/11/20(水) 23:30:36.92
>>29
((--i)) でiが0になる時、返り値1なんだ。
iが負の値になる時でも返り値0なのに、0になる時だけ特別なんですね。

2013/11/14

transpose コマンド(tsv/csvの行列転置)

行列転置したいことは結構あるのに、shellでやろうと思うとちょっと面倒くさい。普段はExcelで「形式を指定して貼り付け」しているけど悔しい。

ので、簡単なコマンドにした。以前作ったcsv2sqlをコピってちょっと書き換えただけ。

ソースはこちら。