20201010のLinuxに関する記事は2件です。

【linux】コマンド・知識

linuxコマンドを学習して、使えそうだと思ったもの・忘れないようにしたいものを備忘録として抜粋。
その都度更新していく予定。

索引

コマンド

less

  • 中身が長いファイルの中身を見る時に使う。
  • ファイルの中身を見る時にスクロール操作や検索ができる。

スクロール

コマンド 動作
スペースキー
もしくは
f
1画面分下にスクロール
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用語辞典
パーミッションについて
ファイルのパーミッションと属性

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

R で SHA256 値を求める(おまけ付き)

使う機会少なすぎて、使いおうと思った時に思い出すこともできないのでメモです。

実行環境

  • Ubuntu 16.04
  • R 3.6.3

RでSHA256

RでSHA256
if (!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"
]

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む