シェルスクリプト

LANに接続している機器のIPv4アドレスを列挙する(ping絨毯爆撃)

たまにLANに接続している機器のIPアドレスを知りたい時がある。PCやゲーム機あたりなら本体の機能でIPアドレスを確認すれば済む。しかし相手がホームゲートウェイ/ブロードバンドルータや無線LANアクセスポイントやUSBメディアサーバで、ハードウェア本体に…

PINコード(数字のみ)を生成する

暗証番号やPINコードに使えるような、指定された桁数のランダムな整数値を生成したいのである。英数記号を用いたパスワード文字列の自動生成については知見があるのだが、「数字のみ」という条件が付いた途端に、「あれ? そういえば、どう生成すればよいの…

改行コードを問わずにテキストファイル中の連続する空白行を1行に縮めて上書きしたい

注文の多いタイトルである。 テキストファイル中の連続する空白行を1行に縮めたい。 縮めた結果を元ファイルに上書きしたい。元ファイルのバックアップは残さなくてよい。 CR、LF、CRLFのいずれの改行コードのファイルでも使えるようにしたい。 出力結果では…

macOS上で削除できないファイルのロックを解除する(ターミナルで)

WindowsとmacOSを本格的に併用していた時期に気づいたのだが、Windowsで「読み取り専用」に設定したファイルは、macOSではロックされたファイルとして認識されるようだ。明示的にロックを解除しない限り、macOSのFinderでは削除できない。Windowsでは誤って…

Re: シェルスクリプトを書くのをやめる

この記事はシェルスクリプトを書くのをやめる - blog.8-p.infoの個人的感想である。なお元の記事を書いた人と私は全くの赤の他人であり、何の接点もない。つまりこの記事は単なる外野のたわ言である旨をご承知いただきたく。 Re: シェルは悪いプログラミング…

シェルスクリプトを生成するシェルスクリプト

超小規模な社内サーバの管理に関わることが多いためか、管理用に「スクリプトを生成するスクリプト」を作成することがある。「スクリプトを生成する」と書くと、なにかしら大層なことをやっているように聞こえるが、何のことはない、単に可変のパラメータを…

シェルスクリプトでJavaScript文字列リテラル用のエスケープ

「JavaScript文字列リテラル用のエスケープ」という表現は微妙だけど、要はサーバサイドでJavaScriptを動的生成する時に、文字列リテラルとして任意のパラメータを出力したい場合のエスケープ処理。先日(というか先月)書いたHTMLエスケープ用のシェルスク…

シェルスクリプトでHTMLエスケープ

PHPやPerlでのHTMLエスケープの話はよく目にするけど、そういえばシェルスクリプトでは見かけないなあ、なんて思った次第でございます。動的Webコンテンツの先駆けであるCGIの普及期でさえ言語としてPerlが大々的に使われていたわけで、そもそもサーバサイド…

umask(1)は引き算しない、多分。

umask(1)の仕様を調べようとしたのである。で、ググって見つかった「デフォルトのファイルアクセス権 (umask) (Solaris のシステム管理 (基本編))」を見てちょっと驚いた。 設定する umask の値は、与えたいアクセス権の値を 666 (ファイルの場合) または 77…

リンク切れしたシンボリックリンクを探す

id:eel3:20121112:1352651058 でシンボリックリンクを張りなおすMakefileを書いたのだが、デッドリンク(リンク切れしたシンボリックリンク)がそのまま残ってしまう問題があった。この問題に対処するために、デッドリンクを探す方法を――『覚えて便利 います…

シェルスクリプトを本気で学びたい人のための10冊

シェルスクリプトについて、プログラミング言語の一種としてガッツリ学んだうえで、しかし得手不得手を見極めて、無理せずシェルスクリプトらしい使い方にとどめて日々を過ごしたい人のための10冊を選出すると、だいたいこんな感じとなる。前提として「他の…

シェルスクリプトに向いている用途

シェルスクリプトに向いている用途は、大抵の場合、以下の要件を1つ以上満たしているものだ。 作りたいものが単機能で、あまり複雑ではない。 非対話的な処理である。 既存のコマンドの羅列/組み合わせで容易に解決できる内容である。 他の言語でいう「メソ…

あえてbc(1)した話

たぶんまだまだ初級な小ネタ。こんな感じに16進数(プレフィックスなし)のデータが並んでいるテキストファイルtest.datがあって: 00000000 00000001 0000000F 00000010 7FFFFFFF 80000000 FFFFFFFE FFFFFFFFこれを元データ(32bit符号なし整数)としてちょ…

cat(1)しない話

初級小ネタ。例えばgrep(1)する際に、こんな感じのサンプルコードが示されることがある。 cat file.txt | grep foo しかし個人的には次のほうが好みだ。 grep foo file.txt せっかく引数でファイルを指定できるのだから、そちらを使いたい気分になるのだ。tr…

grep(1)しない話

もう1つ、初級小ネタ。DebianやUbuntuで、あるパッケージがインストールされているか否か調べるのに、今までdpkg(1)とgrep(1)を組み合わせていた。 dpkg -l | grep acpi ところで先日、dpkg(1)のmanを見たところ: -l, --list package-name-pattern... 「pac…

続:test(1)でシンボリックリンクか否か判定する時のオプションは-hなのか-Lなのか?

id:eel3:20121117:1353150478 の続き、だろうか? あれから3年ちょっと経つが、test(1)でファイルがシンボリックリンクか否か判定する時に-hと-Lのどちらを使うべきか、未だに迷い続けている。「どちらでもよい」と言われるとかえって迷ってしまう、難儀な性…

AWKで1byteずつファイルを読む方法 + 1文字ずつ読む方法の構想

id:eel3:20151102:1446476928 のhcaslのsh版にて、AWKで標準入力/ファイルを1byteずつ読むために試行錯誤したので、独立した記事として書いておく。現時点での結論としては、POSIXの範囲内では、awk(1)単体で標準入力やファイルから1byteずつ中身を読む方法…

8つの言語でテキストフィルタを書き比べた

※2015/11/15追記:現段階では8言語から12言語に増えている。その昔 id:eel3:20120129:1327845759 なんてことをやったのだが、性懲りもなくまた同じようなことをやってみた。作ったものはこちらに置いてある。 GitHub - eel3/hcasl: Command line tool for "h…

英辞郎の辞書ファイル(テキスト形式)をPDIC 1行テキスト形式に変換する

英辞郎のテキスト形式の辞書ファイルが入手できなくなったと聞いて、あわてて『英辞郎 第八版(辞書データVer.141/2014年8月8日版)』を入手した。付属する辞書はVer.1.41。以前購入したのがVer.1.02(2007年03月ごろ)なので、8年半ぶりだ。私の英辞郎の使い…

シェルスクリプトにGo言語を埋め込む

Go言語のコードをスクリプトとして即時実行する方法は、 go run するなり、もう少し工夫して shebang もどきを使って単体のコマンドっぽく実行するなり、いずれも簡単で情報もそれなりに見つかる。一方で、例えば perl(1) や ruby(1) でオプション -e を使う…

ソースコードから標準Cライブラリに含まれてそうな識別子を検索する

組み込み関連でクロスプラットホームなライブラリを開発する時、私の周囲十数メートルの範囲では、使用している標準Cライブラリの機能をドキュメントに明記することがある。というのも、そのライブラリがフリースタンディング環境で使用される可能性があるか…

ゼロパディングされた連番を出力+ディレクトリを作成

1〜12月の各月のデータを格納する目的で、ゼロパディングされた数値でディレクトリを作成したい。楽をしたいので、まずはゼロパディングされた連番を出力する方法を探ってみた。 シェルスクリプト(/bin/sh)の場合 seq(1)には、ゼロパディングして数値の幅…

シェルスクリプト高速化のツボ

これは備忘録。色々あって、まだ具体的なモノを何も作ってもないのにシェルスクリプトのパフォーマンス絡みでネタを収集してしまったので、ひとまずまとめてみた。shellshock(bashのアレ)があったばかりなので、ちっとばかり微妙かも。 計測してボトルネッ…

sed(1) VS printf(1) VS awk(1) リターンズ

id:eel3:20141011:1412954857 の続き。いや、CygwinではなくLinuxで計測してみただけですがな。Cygwinは少々特殊な環境だし、そもそもWindows上ではアンチウイルスソフトその他の影響でプロセス生成コストが高くなる。Unix環境でのプロセス生成コストとは大…

sed(1) VS printf(1) VS awk(1) 宿命の対決

テキストファイルに1行1個ずつ書かれているデータを、同じテンプレートを適用して出力したいのです。例えば、テキストファイルの中身がこんな感じだと仮定する。 1 2 3これを、こんな感じに変換する。 echo 1 ! echo 2 ! echo 3 !こんな風に、何らかのテンプ…

シェルスクリプトで末尾呼び出しの最適化

末尾呼び出しの最適化という最適化手法があって、これが有効な場合にスタックフレームの消費が抑えられる。具体的には、関数Aの末尾で関数Bを呼び出していて、関数Bの呼び出しについて末尾呼び出しの最適化が有効となった場合、関数B実行時に新たにスタック…

日本語版Squeakを任意のディレクトリから起動したい

日本語版Squeakという、SqueakをローカライズしたSmalltalkの処理系がある。何となく雰囲気的に開発者向けにリリースしている感じがするのだが、外野の私の気のせいかもしれない。起動用にバッチファイルとシェルスクリプトが用意されていて、環境に応じてこ…

Real World FizzBuzz

FizzBuzzプログラムは、プログラマを採用する時に全くコードを書けない人を足切りするために考案されたものだ。非常にシンプルで、汎用の高水準なプログラミング言語でコードを書ける人が慣れた言語を使えば、typoなどの細かいミスを除けば2〜3分程度で書け…

シェルスクリプトで統計処理初級、awk(1)なしで

統計処理と言えるほどではないが、データ処理して中央値や最頻値を眺めていて思った。ある程度本格的に統計処理する人はR言語とかOctaveとかPython*1とかを使うと思うし、そうでない人もPerlやRubyなどのスクリプト言語を使うと思う。シェルスクリプト使いも…

tac(1)やtail -rの代替品 迷走編

LinuxというかGNU coreutilsにはtac(1)というコマンドがある。デフォルトではtac(1)はファイルを行番号の降順に(最終行から先頭行に向かって)表示する。 $ seq 1 10 1 2 3 4 5 6 7 8 9 10 $ seq 1 10 | tac 10 9 8 7 6 5 4 3 2 1 $ seq 1 10 >zzzz1.txt $ …