- 投稿日:2020-10-10T21:11:08+09:00
【linux】コマンド・知識
linuxコマンドを学習して、使えそうだと思ったもの・忘れないようにしたいものを備忘録として抜粋。
その都度更新していく予定。索引
コマンド
less
- 中身が長いファイルの中身を見る時に使う。
- ファイルの中身を見る時にスクロール操作や検索ができる。
スクロール
コマンド 動作 スペースキー
もしくは
f1画面分下にスクロール b 1画面分下にスクロール j 1行下にスクロール k 1行上にスクロール g ファイルの先頭に移動 G ファイルの末尾に移動 検索
コマンド 動作 /<文字列> <文字列>を上から下方向に検索 ?<文字列> <文字列>を下から上方向に検索 n 次の検索結果に移動 N 前の検索結果に移動 touch
- 本来はファイルのタイムスタンプを更新・変更するコマンド。
- ファイルが存在しない時は、空のファイルを作成する。
- ファイルが存在する時はタイムスタンプを更新するので、中身のあるファイルを誤って上書きしてしまう心配がない。
diff(差分比較)
- ファイル同士の差分を表示するコマンド。
$ cat sample1.csv カラム1,カラム2,カラム3 1,2,3 a,b,c あ,い,う $ cat sample2.csv カラム1,カラム2,カラム3 1,2,3 d,e,f あ,い,う $ diff sample1.csv sample2.csv 3c3 < a,b,c --- > d,e,f
- 試しに上のcsvファイルから差分を表示し、もともとのヘッダー(カラム行)も先頭に追加してみる。
$ diff sample1.csv sample2.csv | grep -E "^>" | sed -e 's/^> //g' | sed "1 i `head -n 1 sample1.csv`" カラム1,カラム2,カラム3 d,e,f
コマンド 動作 grep -E "^>" 先頭が >
の行のみを抽出sed -e 's/^> //g' 先頭の >
を削除sed "1 i <テキスト>" <テキスト>を1行目に挿入 head -n 1 sample1.csv sample1.csvの1行目 sed(テキストの置換処理)
- テキストファイルを編集するスクリプト言語。
- 置換処理には
-e
オプションを指定する。(省略可)$ cat sample2.csv カラム1,カラム2,カラム3 1,2,3 d,e,f あ,い,う $ sed -e 's/d,e,f/a,b,c/g' sample2.csv カラム1,カラム2,カラム3 1,2,3 a,b,c あ,い,う # 上の書き方だとsample2.csvは上書きされていない $ cat sample2.csv カラム1,カラム2,カラム3 1,2,3 d,e,f あ,い,う【参考記事】
bioinformatics(sed)
sedコマンドの備忘録後方参照
- 置換前の文字列を置換後の部分でも使いたいとき。
- csvから特定のカラムを取り出してみる。
$ cat sample.csv name,age,address,job 佐藤,30,東京都,教師 加藤,18,神奈川県,学生 五十嵐,25,埼玉県,医師 $ sed -e "s/\(.*\),\(.*\),\(.*\),\(.*\)/\1,\3,\4/g" sample.csv name,address,job 佐藤,東京都,教師 加藤,神奈川県,学生 五十嵐,埼玉県,医師特定の文字列を含む行を削除する
$ sed '/^佐藤/d' sample.csv name,age,address,job 加藤,18,神奈川県,学生 五十嵐,25,埼玉県,医師先頭に「佐藤」が含まれる行を削除した。
【参考記事】
sedで指定した行の削除をする方法(サンプルコードあり)置換後のファイルを上書き保存する
- iオプションで上書き保存ができる。
上で記述した削除の場合で考えてみる。
$ sed '/^佐藤/d' sample.csv name,age,address,job 加藤,18,神奈川県,学生 五十嵐,25,埼玉県,医師 # これだと上書きされていない $ cat sample.csv name,age,address,job 佐藤,30,東京都,教師 加藤,18,神奈川県,学生 五十嵐,25,埼玉県,医師 $ sed -i '/^佐藤/d' sample.csv $ cat sample.csv name,age,address,job 加藤,18,神奈川県,学生 五十嵐,25,埼玉県,医師【参考記事】
sedで置換してファイルを上書きするcut(テキストの切り出し)
- 今回は、テキストの行から固定長またはフィールド単位で指定した部分だけを切り出す。
- デフォルトの区切り文字はタブ。
範囲指定&区切り文字変更
cut -d ',' -f 3-8 sample.csv
-d ','
で区切り文字をカンマに変更-f 3-8
で3番目から8番目のテキストを切り出す
-f 3,8
とすると、3番目と8番目のみを切り出す【参考記事】
【 cut 】コマンド――行から固定長またはフィールド単位で切り出す知識
リダイレクト
- 入出力先を変更する機能。
ファイルディスクリプタ(入出力の番号)
- 標準入出力にはそれぞれファイルディスクリプタという番号が振られており、これらの番号はリダイレクトでよく使用される。
ファイルディスクリプタ 入出力 0 標準入力 1 標準出力 2 標準エラー出力 入力のリダイレクト
ファイルから入力する機能
$ cat < /etc/hosts 127.0.0.1 localhost ::1 localhost出力のリダイレクト
コマンドの実行結果を画面に表示せずに、ファイルに保存する。
$ ls work abc.txt hoge test $ ls work > output.txt $ cat output.txt abc.txt hoge test
コマンド > 出力ファイル
の形。- 出力ファイルがない場合に実行しても、自動的にファイルは作成される。
エラー出力のリダイレクト
エラーの内容を画面に表示せずに、ファイルに保存する。
$ ls hoge ls: hoge にアクセスできません: そのようなファイルやディレクトリはありません $ ls hoge 2> error.txt $ cat error.txt ls: hoge にアクセスできません: そのようなファイルやディレクトリはありません
コマンド 2> 出力ファイル
の形。標準出力とエラー出力をまとめる
$ ls / hoge > output.txt 2>&1 $ cat output.txt ls: hoge にアクセスできません: そのようなファイルやディレクトリはありません /: bin boot dev etc home
コマンド 2> 出力ファイル 2>&1
の形。リダイレクトによる追記
>
は同じファイルを指定した場合、上書きされる。>>
は上書きではなく追記される。$ echo one > output.txt $ cat output.txt one $ echo two >> output.txt $ cat output.txt one two【参考記事】
5分で一通り理解できる!Linuxのリダイレクト 使い方と種類まとめ/dev/null
- 入力先に指定したところで何も返されないし、出力先に指定してもデータは消えて何も表示されない。
- 1つ目の参考記事の例えがわかりやすいと思います。
ブラックホールなファイル。
吸いこむことはあっても吐き出すことはありません。使われるケースとして多いのは、出力を表示したくない時
hoge.sh > /dev/null
これだとエラー出力は普通に表示されてしまうそうなので、エラー出力も捨ててしまいたい場合は、以下のように書きます。(bashの場合)
hoge.sh > /dev/null 2 > &1【参考記事】
/dev/nullとは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
【Linux】/dev/nullをエンジニアが使う2つの目的
Linux、「/dev/null」とはなんぞや?パーミッション
- フォルダやファイルに対するアクセス権・権限のこと。
- 3つの実行権と3つの所有権がある。
- つまりは、「誰」が「どのような権限」を持っているかを定めたもの。
所有権 自分(Owner) グループ(Group) その他(Other)
実行権 記号 読み r 書き w 実行 x 例えば、以下のようにシェルの「許可がありません」と言われた時
$ cat test.sh echo "abcde" $ ./test.sh -bash: ./test.sh: 許可がありません $ ls -l test.sh -rw-r--r--. 1 root root 0 10月 6 03:04 test.sh
ファイル
タイプオーナー グループ その他 - r w - r - - r - - このように、シェルの実行権(x)がないことがわかる。
実行権の付与
上記のように実行権がなかったときは
chmod
コマンドで追加する。$ chmod u+x test.sh $ ./test.sh abcde $ ls -l test.sh -rwxr--r--. 1 root root 13 10月 6 03:53 test.sh
記号 意味 u 自分に対して + 権限を追加 x 実行権 【参考記事】
パーミッション | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
パーミッションについて
ファイルのパーミッションと属性
- 投稿日:2020-10-10T17:20:29+09:00
R で SHA256 値を求める(おまけ付き)
使う機会少なすぎて、使いおうと思った時に思い出すこともできないのでメモです。
実行環境
- Ubuntu 16.04
- R 3.6.3
RでSHA256
RでSHA256if (!require("openssl")) install.packages("openssl") print(openssl::sha256("hello!")) # -> [1] "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b" if (!require("openssl")) install.packages("openssl") print(openssl::sha256("ハロ!")) # -> [1] "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"コマンドラインから実行する場合
コマンドラインから実行する場合Rscript -e ' if (!require("openssl")) install.packages("openssl") print(openssl::sha256("hello!")) 'その結果が本当に正しいかを確かめる
本当にあっているか不安…。この不安は異なる環境で結果が同じかどうかをチェックしないことには払拭できないと思ったので、調べてみたところ多くの場合でワンライナーで書けるくらい簡単だったのでメモです。
以下のなかから実行できそうなのを2つ3つくらい、日本語も含めて実行して同じ結果かをチェックしたら良いかなって。
Linuxコマンド
SHA256のテスト(Linuxコマンド)#echo+sha256sumを使う echo -n "hello!" | sha256sum # -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b - echo -n "ハロ!" | sha256sum # -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42 - #echo+opensslを使う echo -n "hello!" | openssl sha256 # -> (stdin)= ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b echo -n "ハロ!" | openssl sha256 # -> (stdin)= 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42
echo
コマンドだと-n
オプションを忘れちゃうことがあるのでprintf
コマンドの方が良いかも。printfでSHA256のテスト(Linuxコマンド)printf "hello!" | sha256sum # -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b - printf "ハロ!" | sha256sum # -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42 -Node.js13.5
SHA256のテスト(Node.js)console.log(require("crypto").createHash("sha256").update("hello!").digest("hex")) // -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b console.log(require("crypto").createHash("sha256").update("ハロ!").digest("hex")) // -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42コマンドラインから実行する場合
コマンドラインから実行する場合node -e ' console.log(require("crypto").createHash("sha256").update("hello!").digest("hex")) 'Python3.5
SHA256のテスト(Python)#3.5 print(__import__("hashlib").sha256("hello!".encode("utf-8")).hexdigest()) print(__import__("hashlib").sha256("ハロ!".encode("utf-8")).hexdigest())コマンドラインから実行する場合
コマンドラインから実行する場合python3 -c ' print(__import__("hashlib").sha256("hello!".encode("utf-8")).hexdigest()) 'Ruby2.3
SHA256のテスト(Ruby)require "digest/sha2" print Digest::SHA256.hexdigest("hello!") # -> "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b" require "digest/sha2" print Digest::SHA256.hexdigest("ハロ!") # -> "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42" #または require "openssl" print OpenSSL::Digest::SHA256.hexdigest("hello!") # -> "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b" require "openssl" print OpenSSL::Digest::SHA256.hexdigest("ハロ!") # -> "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"コマンドラインから実行する場合
コマンドラインから実行する場合ruby -e ' require "openssl" print OpenSSL::Digest::SHA256.hexdigest("hello!") 'Perl5
SHA256のテスト(Perl)use Digest::SHA qw(sha256_hex); print sha256_hex("hello!"); # -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b use Digest::SHA qw(sha256_hex); print sha256_hex("ハロ!"); # -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42コマンドラインから実行する場合
コマンドラインから実行する場合perl -e ' use Digest::SHA qw(sha256_hex); print sha256_hex("hello!"); 'JavaScript
SHA256のテスト(JavaScript)/* https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest から引用 */ async function digestMessage(message) { const msgUint8 = new TextEncoder().encode(message); const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8); const hashArray = Array.from(new Uint8Array(hashBuffer)); const hashHex = hashArray.map(b=>b.toString(16).padStart(2, '0')).join(''); return hashHex; } console.log(await digestMessage("hello!")) // -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b console.log(await digestMessage("ハロ!")) // -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42 //mapでまとめて実行したいとき let target = ["hello!", "ハロ!"]; console.log(await Promise.all(target.map(s=>digestMessage(s)))) // -> [ "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b", "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42" ]