一般ユーザの作成と削除

一般ユーザ名:linux を作成する場合

# useradd linux

ログインできないユーザ linux を作成する場合

# useradd -s /sbin/nologin linux

んで、パスワード設定をする

# passwd linux

削除は

# userdel -r linux

-r というオプションを付けることでホームディレクトリの /home/linux も削除される


ログイン可不可の変更

ユーザ linux をログインできないようにする

# usermod -s /sbin/nologin linux

ユーザ linux をログインできるようにする

# usermod -s /bin/bash linux

パスワードを変更する

一般ユーザ(linux)のパスワードを変更する

# passwd linux

ユーザのチェンジ

一般ユーザから root へ

$ su -

root から変更前の一般ユーザへ戻る(または、ログアウト)

# exit

root から任意の一般ユーザ ( linux ) へ

# su - linux

su できない nologin ユーザ ( nologinuser ) へ

# su -s /bin/bash - nologinuser

( # は root の印、$ は一般ユーザの印)


システムの停止と再起動

今すぐ停止は

# shutdown -h now

今すぐ再起動は

# shutdown -r now

MACアドレスを知る

# ifconfig

(etherの値がMACアドレス)


ファイルの一覧表示

自分がアクセスしているディレクトリ内のファイルを一覧表示する

# ls

隠しファイルを含むすべてのファイルを表示する

# ls -a

属性も表示させる

# ls -l

すべてのファイルの情報を詳細に表示する

# ls -al

現在自分がアクセスしている場所(ディレクトリ)を表示する

# pwd

アクセスするディレクトリを移動する

/root にいる状態から /home/linux に移動する

# cd /home/linux

cd コマンドだけ実行するとホームディレクトリへもどる

$ cd

↑一般ユーザ ( linux ) だと /home/linux にもどる

# cd

↑ root だと /root にもどる


空のファイルを作る

ファイルがない場合に空のファイルが作られる(ファイルがある場合は何もしない)

# touch newfile

ファイルがある場合には空のファイルに置き換わる

# echo -n > newfile

オプション
-n :行末の改行を行わない


タイムスタンプを変更する

ファイルのタイムスタンプを現在の時刻に変更する。

# touch file

オプション
-t :指定した日時に変更する。書式は、[[CC]YY]MMDDhhmm[.ss]
[ ]内は省略可能。「MMDDhhmm」は「月・日・時・分」をそれぞれ2桁で表示するという意味で、月の前に2桁追加すると西暦の下2桁、という意味になる。


ディレクトリを作る

ディレクトリ (test) を作る

# mkdir test

存在しない test ディレクトリ内に sub ディレクトリを作成する

# mkdir -p test/sub

-p :ディレクトリが存在していてもエラーを返さない。必要に応じて親ディレクトリを作成する。


ファイル,ディレクトリの削除

# rm ファイル名

# rm -r ディレクトリ名

削除確認なしにする

# rm -rf ディレクトリ名

ファイル,ディレクトリの名前変更と移動

名前を変更する。(test1→test2)

# mv test1 test2

移動する。(test1→user/newdir/test1)

# mv test1 user/newdir

オプション
-f :同名ファイルがある時も上書きの確認の問い合わせなく上書きをする


コピーする

【ファイルをコピーする】

違う名前で同一ディレクトリにコピーする。(file1 を file2 という名前で複製)

# cp file1 file2

現行ディレクトリのファイルを別のディレクトリにコピーする。(file1 → user/newdir/file1)

# cp file1 user/newdir

コピー先ファイル名を「.」にすると、現在アクセスしているディレクトリにコピーされる。

# cp /usr/local/test.txt .

↑「/usr/local/」ディレクトリにある「test.txt」ファイルが現在アクセスしているディレクトリにコピーされる。

オプション -p を使うと、ファイルの所有者,タイムスタンプ,アクセス権限などの情報もコピーされる。

【ディレクトリごとコピーする】

dir1 ディレクトリ以下をすべて dir2 にコピーする。

# cp -r dir1 dir2

【なるべく“そっくりそのまま”コピーする】

「file1」を「file2」にコピーする。ファイルの属性はなるべく保持され、シンボリックリンクはそのままコピーされる。

# cp -a file1 file2

「dir1」を「dir2」にコピーする。ディレクトリの内容もそのままコピーされる。

# cp -a dir1 dir2

file.conf.orig というファイル名のコピーを作成する。

# cp -a file.conf{,.orig}

シンボリックリンクの作成

# ln -s リンク元 リンク先

オプション -s :作成するリンクがシンボリックリンクであることを表す
リンク元とリンク先の順番は cp コマンドなどと同じ


ファイル,ディレクトリの所有者,グループを変更する

file の所有者を user1 にする。

# chown user1 file

file の所有者を user1 ,所有グループを linux にする。

# chown user1:linux file

↑所有者だけでなくグループ所有権も同時に指定する場合には、それらを : で並べる。
所有者,グループ所有権とも同じにする場合( user1 )は、以下でも可。

# chown user1: file

オプションに -R を指定し、ファイル名にディレクトリを指定した場合には、そのディレクトリ以下の全てのファイルに対して同じ所有者,グループ所有権が設定される。

# chown -R root:www /var/www/html

↑/var/www/html ディレクトリ以下にある全てのファイルの所有者を root に、グループを www に変更する。


ファイル,ディレクトリのアクセス権限を変える

file の所有者に読み・書き・実行権限 ( 4+2+1=7 ) を、グループとその他に読み取り権限 ( 4 ) を与える。

# chmod 744 file

オプションに -R を指定し、ファイル名にディレクトリを指定した場合には、そのディレクトリ以下の全てのファイルに対して同じ設定が行われる。

同じ拡張子のファイルをまとめて設定するには、 * を使う。

# chmod 755 *.cgi

↑拡張子が cgi のファイルを全て 755 に変更

アクセス権(パーミッション)の意味
ファイルディレクトリ
「r」読み(4)ファイルの内容を表示(catコマンドなど)ディレクトリ内のリスト表示(lsコマンドなど)
「w」書き(2)ファイルの内容を編集ディレクトリ内にファイル作成や削除
「x」実行(1)実行ファイルの実行そのディレクトリに移動(cdコマンド)

サービスの設定管理をする

サービス一覧

# systemctl list-unit-files --type=service

サービス起動

# systemctl start [name]

サービス停止

# systemctl stop [name]

サービス再起動

# systemctl restart [name]

サービスリロード

# systemctl reload [name]

サービスステータス表示

# systemctl status [name]

サービス自動起動有効

# systemctl enable [name]

サービス自動起動無効

# systemctl disable [name]

サービス自動起動設定確認

# systemctl is-enabled [name]

サービス自動起動有効+起動

# systemctl enable --now [name]

ファイアウォールの設定管理をする

サービスの状態確認

# firewall-cmd --state running

アクティブゾーンの確認

# firewall-cmd --get-active-zones public interfaces: eth0

public ゾーンの恒久的な設定の確認

# firewall-cmd --list-all --zone=public --permanent

登録可能なサービス名一覧

# firewall-cmd --get-services

サービスの追加(public ゾーンに対して、http を恒久的な設定として追加する)

# firewall-cmd --add-service=http --zone=public --permanent

設定を反映させる

# firewall-cmd --reload

ポート番号の追加(public ゾーンに対して、8080/tcp を恒久的な設定として追加する)

# firewall-cmd --add-port=8080/tcp --zone=public --permanent

許可アドレスの追加(public ゾーンに対して、恒久的な設定として追加する)

# firewall-cmd --add-source=192.168.0.0/24 --zone=public --permanent

拒否アドレスの追加(「drop」ゾーンに対して、追加することで拒否 IP アドレスとなる)

# firewall-cmd --add-source=192.168.11.0/24 --zone=drop --permanent

設定の削除は、「--add」の部分を「--remove」にする。


ネットワークの設定管理をする

インタフェースおよびステータスを表示

# nmcli d DEVICE TYPE STATE CONNECTION eth0 ethernet 接続済み System eth0 lo loopback 管理無し --

個別インターフェースのパラメータ一覧表示

# nmcli d show eth0

固定 IPv6 アドレスを設定

# nmcli c mod "System eth0" ipv6.addresses 2001:db8::/32
# nmcli c mod "System eth0" ipv6.method manual

デフォルトゲートウェイを設定

# nmcli c mod "System eth0" ipv6.gateway 2001:db8::1

DNS サーバの設定

# nmcli c mod "System eth0" ipv6.dns 2606:4700:4700::1111,2606:4700:4700::1001

設定反映

# nmcli c up "System eth0"

cat コマンド

内容が短いファイルの中身を表示する。

# cat file

リダイレクション

# cat file > file1

# cat file >> file1

> 標準出力をファイルにする(コピー)
>> 標準出力をファイルに追加する


htpasswd コマンド

.htpasswd ファイルを新規作成する。パスワードを MD5 でハッシュする。

# htpasswd -cbm ./.htpasswd username password

既存の .htpasswd ファイルへユーザーを追加する。パスワードを MD5 でハッシュする。

# htpasswd -bm ./.htpasswd username password

パスワードを bcrypt コスト 10 でハッシュし標準出力する。

# htpasswd -nbB -C 10 username password username:$2y$10$au6Ff1lSzR3A/Bq2qCEPiOXsal9VDfjoK/Y90IMSwXxV99/GjpFPy

オプション
-b:パスワードを、対話式入力ではなくて、コマンドライン引数として指定できるようにします。パスワードはコマンドラインで見えるため、履歴に残るので注意。
-c:新しいパスワードファイルを作成します。もし、同名のパスワードファイルがすでに存在する場合は、既存の内容が削除されます。上書きされたくなければ -c を取って、ファイル名を指定します。
-m:パスワードを MD5 でハッシュします。
-n:どのような結果になるかのみを標準出力して終了します。パスワードファイルを作りません。
-B:パスワードを bcrypt でハッシュします。これは現在、非常に安全であると考えられています。
-C:-B(bcrypt)との組み合わせでのみ許可されます。ストレッチング回数(コスト)を設定します。数を増やすと安全ですが処理時間が遅くなります。デフォルト:5、有効:4〜17。
-D:ユーザーを削除します。指定された .htpasswd ファイルにユーザー名が存在する場合、削除されます。
-v:パスワードを照合します。指定されたパスワードが、指定された .htpasswd ファイルに保存されているユーザーのパスワードと一致することを確認します。

バージョンによってオプションやデフォルト値が異なるので、Usage を確認。

# htpasswd

秘密鍵と自己署名証明書を作成

秘密鍵と自己署名証明書を一括で作成

# openssl req -x509 -sha512 -nodes -days 365 -newkey rsa:2048 -keyout private.key -out server.crt ‥‥‥‥‥ ‥‥‥‥‥ Country Name (2 letter code) [XX]:JP State or Province Name (full name) []:Tokyo Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:www.example.com Email Address []:admin@example.com

秘密鍵の内容を確認

# openssl rsa -text -noout -in private.key

証明書の内容を確認

# openssl x509 -text -noout -in server.crt

SSH の公開鍵と秘密鍵を作成

# ssh-keygen -t rsa -b 4096 -C "" Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:zQCfC3+ezXNbyjB+0r+XsfV8uMuhq1qqAiM4FDDe0L0 The key's randomart image is: +---[RSA 4096]----+ |+.. . . | |.oo. . o . | | ... o + | | . E o = | |o S + | |+ o o + ..| | o o + *.ooB| | . o ..O+B=| | ...o...++B==| +----[SHA256]-----+

オプション
-t 方式:作成する鍵の暗号化形式を指定する。
-b ビット数:作成する鍵のビット数を指定する。
-C コメント:コメントを指定する。「-C ""」でコメントを削除。(デフォルトは「ユーザー名@ホスト名」)

オプションなしのデフォルト値では。↓

# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:ItXlRCbefj/pVMC0dC58JEZBvaBQn1+nrHoYs3yzwZg user@localhost.localdomain The key's randomart image is: +---[RSA 3072]----+ | ..*. oOoo| | o O .B.*.| | . o + .oB *| | . . . ..*o| | . . S . . o..| | . . o= o o | | .E=+ = | | +.++ . | | .o.o. | +----[SHA256]-----+

デフォルト値やオプションで選択できる値などは、ssh のバージョンにより異なることがある。

# ssh -V OpenSSH_8.1p1, OpenSSL 1.1.1d FIPS 10 Sep 2019

# man ssh-keygen

メモリの使用状況を表示する

# free -m total used free shared buff/cache available Mem: 3808 1528 316 271 1963 1763 Swap: 3939 0 3939

オプション
-m:メモリ使用量をメガバイト単位で表示

空きメモリ量は、available の値


現在登録されているユーザ情報を確認する

# cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin ‥‥‥‥‥ ‥‥‥‥‥

1行で1ユーザとなります。「:」(コロン)がフィールド区切りで、各フィールドの意味は下記の通りです。

第1フィールド:ログイン・ユーザ名。
第2フィールド:パスワード用のフィールド。シャドウ・パスワードという機能が有効になっているため、ここにはパスワードは表示されず「x」という文字が記述されている。
第3フィールド:ユーザ番号。
第4フィールド:グループ番号。
第5フィールド:コメント欄(ユーザーのフルネームなどを記述する)。
第6フィールド:ホーム・ディレクトリ(ユーザーがログインしたときの最初のディレクトリ)。
第7フィールド:ログイン・シェル(ユーザーがログインすると、ここに記述したシェルが起動する)。


システムで実行しているプロセスを表示する

# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

a:自分以外のユーザーのプロセスも表示する
u:ユーザ名,CPU占有率,メモリ占有率,開始時刻などを表示
x:制御端末のないプロセス(デーモンなど)の情報も表示する
w:表示内容が長い場合に、w ひとつあたり1行分表示行を増やす。

表示されるそれぞれの要素の意味は以下の通りです。  

USER:所有するユーザ名
PID:プロセスID
%CPU:CPU時間と実際に処理した時間の比率
%MEM:実メモリの使用量
VSZ:仮想メモリの全サイズ
RSS:使用中の物理メモリ量
TTY:制御端末の種類及び番号
STAT:プロセス状態
 R 実行中 (running)
 S 休眠中 (sleeping)
 D 割込み不可能な休眠中
 T 停止中かトレース中
 Z ゾンビプロレス
 W スワップ・アウトしたプロセス
 N ナイス値が正であることを表す
START:開始時刻
TIME:実行時間
COMMAND:プロセスのコマンド名


プロセスおよびジョブを終了させる

プロセスID pid のプロセスを終了する

# kill pid

だめなら、強制終了

# kill -9 pid

dnf コマンド

パッケージの新規インストール

# dnf install (パッケージ名)

パッケージのアンインストール

# dnf remove (パッケージ名)

アップデート可能なパッケージの一括アップデート

# dnf -y update

パッケージグループ名を英語で一覧表示する

# LANG=C dnf group list

グループ単位のインストール

# dnf group install "グループ名"

キーワードでパッケージを検索

# dnf search (キーワード)

ファイル名からパッケージ名を逆引き

# dnf provides (ファイル名)

RPM コマンド

rpm パッケージのファイル名を package-3.5-1.i386.rpm とすると、
(package=ファイル名,3=バージョン,5-1=リリース番号,i386=プラットホーム)

詳細情報(v),進行状況(h)を表示してインストール(i)する。

# rpm -ivh package-3.5-1.i386.rpm

パッケージがインストールされているかの問い合わせ。

# rpm -q package

↑インストールされていれば、バージョンも表示される。

古いバージョンがインストールされている場合はアップグレードし、古いバージョンがインストールされていない場合はインストールする。

# rpm -Uvh package-3.5-1.i386.rpm

古いバージョンがインストールされている場合のみアップグレードする場合は

# rpm -Fvh package-3.5-1.i386.rpm

wget コマンド

http://www.example.co.jp/tmp/file.zip をダウンロードする

# wget http://www.example.co.jp/tmp/file.zip

ユーザ認証が必要な Web サイトからダウンロードする場合

# wget --http-user=myuserid --http-passwd=mypassword http://www.example.co.jp/tmp/file.zip

ユーザ認証が必要な FTP サイトの場合

# wget --ftp-user=myuserid --ftp-password=mypassword ftp://ftp.example.co.jp/tmp/file.zip

myuserid がユーザ ID ,mypassword がパスワード

実行を中断するには…、
「Ctrl」+「c」キー

オプション:
-q : メッセージを表示しない。
-O [ファイル名] : 指定したファイル名で保存。
-N : ダウンロード対象と同名のファイルが既に存在する場合、更新時間を比較しローカル側に存在するファイルの方が古ければダウンロードして上書き保存する。但し、更新時間の比較は -O オプションと一緒に使うと無効となる。


ファイルの文字コードを変換する

file をEUCコードで標準出力。

# nkf -e file

file をEUCコードにして file2 の名前で保存。

# nkf -e file > file2

注)もとのファイルと、出力ファイルを同じ名前にしない

file の文字コードを UTF8コード,改行コードをLFにして file2 の名前で保存。

# nkf -wLu file > file2

主なオプションは
-j : JISコードで出力
-e : EUCコードで出力
-s : シフトJISコードで出力
-w : UTF8コードで出力
※オプションを指定しない場合 -j になる。

改行コードを変更するオプションは
-Lu : unix(LF)の改行コードに変換
-Lw : windows(CR+LF)の改行コードに変換
-Lm : mac(CR)の改行コードに変換

入力する文字コードを指定するオプションは
-J : 入力がJISコード
-E : 入力がEUCコード
-S : 入力がシフトJISコード
-W : 入力がUTF8コード
※指定しなくても自動判定が効くが、誤判定のリスクを避ける意味でも、入力する文字コードが分かっている場合は明示的に指定した方がいい。


ファイルやディレクトリを検索する( find , locate )

find (逐次検索)

[dir] ディレクトリの中から [file] ファイルを検索する

# find [dir] -name [file]

例:

# find / -name messages.dat # find /home/usr -name messages.dat

更新日が30日以上古いファイルを削除する

# find /path/to/log -mtime +30 -delete

locate (データベースから検索するので高速)

# locate [file]

※locate ではデータベース更新後に作成されたファイルやディレクトリは検索できない。データベースを再更新するには updatedb コマンドを実行する。

# updatedb

ファイルシステムのドライブ使用状況の表示

現在マウントされている全てのファイルシステムの使用状況を表示

# df -h

-h:サイズに応じた単位で表示する


ディレクトリ内のファイル容量を表示する

カレントディレクトリの容量を表示する

# du -h

-h:サイズに応じた単位で表示する。
-s:指定されたディレクトリの合計のみ表示する。

# du -hs /var/www/html 85M /var/www/html

which と whereis

which:コマンドのパスを表示します

# which sendmail /usr/sbin/sendmail

whereis:コマンドのパスとコマンドのソースファイルおよびマニュアルファイルのパスを表示します

# whereis perl perl: /usr/bin/perl /usr/local/bin/perl /usr/share/man/man1/perl.1.gz

ファイルを書庫化・展開する

arc_dirディレクトリ以下を書庫ファイル(arc.tar)にする

# tar -cvf arc.tar arc_dir

書庫ファイルを展開する

# tar -xvf arc.tar

書庫ファイルの内容を一覧する

# tar -tf arc.tar

書庫ファイルからarc_dir/readme.txtファイルのみを削除する

# tar -vf arc.tar --delete arc_dir/readme.txt

オプション:
-c:書庫を新規に作成する
-f ファイル名:指定した書庫ファイルまたはデバイスを使用する。初期値は/dev/rmt0
-t:書庫の内容を表示する
-v:処理したファイルの一覧を詳細に表示する
-x:書庫からファイルを取り出す
--delete:書庫内からファイルを削除する


解凍コマンド

展開するファイルの拡張子が .tar.gz または .tgz の場合

# tar -zxvf file.tar.gz

展開するファイルの拡張子が .zip の場合

# unzip file.zip

解凍先ディレクトリを指定する
ディレクトリが存在しなければ、bar ディレクトリは作成される。

# unzip foo.zip -d bar

実行したコマンドの履歴を表示する

最近実行した10個の履歴を表示する場合は、以下のように入力する

# history 10

表示された履歴の左側の数字はヒストリの番号で、

# !番号

と入力することにより、その番号のコマンドを実行できる

※コマンド履歴を検索するには【Ctrl+r】

(reverse-i-search)`':

履歴を削除するなど history ファイルを編集

# vi ~/.bash_history

2つのファイルの差分を得る

test1 と test2 ファイルの差分を表示

# sdiff -sB test1 test2

-s:共通な行を表示しない
-B:空行を挿入・削除するだけの違いは無視する


文字列の置換をする

test.html というファイルの euc-jp という部分を UTF-8 に変える

# sed -i 's/euc-jp/UTF-8/g' test.html

-i はファイルを編集するオプション。
-e を指定した場合は、ファイルの変更はせずに標準出力に出力するだけになる。

区切り文字は「/」以外でも可。URL の「/」のエスケープをしなくてよくなる。「!」にした例。

# sed -i 's!http://www.wave440.com!https://www.wave440.com!g' test.html

変数の場合は「'」で囲む

# sed -i 's/number/'${i}'/g' test.txt

連続するスペースを半角スペース一つにする。

# sed -e 's/\s\+/ /g' test.txt

行頭の連続するスペースを削除する。

# sed -e 's/^\s\+//g' test.txt

同じ位置にある文字に置換する。(例:全角数字→半角数字)

# echo "20210713" | sed 'y/0123456789/0123456789/'

最短マッチ(sed は最長マッチのため、否定の文字クラスを利用する。)

# sed -i 's/"visits"[^,]*,/"visits":0,/g' speed-dial-2.json

「"visits":123,」などが「"visits":0,」に置換される。「[^,]」は、「,」ではない文字。


圧縮コマンド( zip )

単一ファイル ( target-file ) を ( file.zip に) 圧縮する

# zip file.zip target-file

ディレクトリごと圧縮する場合は「-r」オプションを使用する

# zip -r directory.zip target-dir

-q:動作中のメッセージを表示しない
-y:シンボリックリンクをたどらずに、シンボリックリンクのまま格納する


文字列を検索する

ファイル内の文字列を検索して該当する行を表示する
拡張子が .txt のファイルにある「diff」という文字列を検索する場合

# grep diff *.txt

標準出力の結果を検索する
「ps aux」というコマンドを実行し、その結果から「telnet」という文字列を含む行を表示する場合

# ps aux | grep telnet

オプション
 -c 該当行は表示せずに、該当した数を表示する
 -h 複数ファイルを検索対象としたときに、結果でファイル名を表示しない
 -i 大文字と小文字の区別をしない
 -l 該当ファイル名だけを表示する
 -L 該当しなかったファイル名だけを表示する
 -n 該当行の行番号を表示する
 -v 該当しない行を表示する
 -f file 検索パターンとしてfileの内容を使用する

再帰的にファイルの内容を検索する
カレントディレクトリ以下から、拡張子 php のファイルのみを対象に、文字列 hoge を含むファイル名と内容を出力

# grep -r hoge --include='*.php' ./

ファイルを分割する

「file」を8行ごとに分割

# split -8 file new_

ファイル確認

# ls file new_aa new_ab new_ac

分割されたファイルの前半部分は「new_」となり、その後に「aa」~「ac」が振られていく。


ファイルを結合する(1)

# cat test.aa test.ab test.ac > file.txt

test.aa + test.ab + test.ac の順番に結合される

# cat test.* > file.txt

ワイルドカードを使うとファイルは昇順に結合される


ファイルを結合する(2)

join コマンド
キーとなる列は昇順に並べておく。

# cat list01.txt 10 aa 30 bb 40 cc 70 dd 90 ee

# cat list02.txt 20 VV 30 WW 50 XX 60 YY 70 ZZ

に対して、単純に二つのファイル名を並べて join すると、キー列の項目において、両方のファイルに存在するもののみ表示する。

# join list01.txt list02.txt 30 bb WW 70 dd ZZ

オプションを使用すると、

# join -a 1 -1 1 -2 1 -o 0 1.2 2.2 -e 'NULL' list01.txt list02.txt 10 aa NULL 30 bb WW 40 cc NULL 70 dd ZZ 90 ee NUL

左から、
join コマンド
-a 1:一つ目のファイル(list01.txt)の行は全て表示する。
-1 1:一つ目のファイル(list01.txt)の1列目をキーとする。
-2 1:二つ目のファイル(list02.txt)の1列目をキーとする。
-o:出力する列番号を指定する。
0:キーを表示。
1.2:一つ目のファイル(list01.txt)の2列目を表示。
2.2:二つ目のファイル(list02.txt)の2列目を表示。
-e 'NULL':指定したフィールドがなければ任意の文字列を表示する。(NULLを表示する)


テキストファイルの行数を数える

# wc file.txt

行数、単語数、バイト数、ファイル名の順に表示される

# wc -l file.txt

行数、ファイル名が表示される

行数のみ得たい場合は、grep を使う

# grep -c '' file.txt

メッセージやテキストファイルを1画面ずつ表示する

# less file.txt

-N : 行番号を表示する


行番号を追加する

# nl test.txt 1 aaa 2 bbb 3 ccc

-nオプション(行番号の表示形式の変更)
ln 左詰め
rn 右詰め(デフォルト)
rz 右詰めで0で埋める

# nl -n ln test.txt 1 aaa 2 bbb 3 ccc

# nl -n rz test.txt 000001 aaa 000002 bbb 000003 ccc

-sオプション(行番号とファイルの内容の間の区切り文字を変更)
デフォルトの区切り文字はTAB

# nl -s':' test.txt 1:aaa 2:bbb 3:ccc

-wオプション(行番号の長さを変更)

# nl -w3 -n rz test.txt 001 aaa 002 bbb 003 ccc

テキストファイルの行を削除する

45行目を削除する

# sed -i '45d' file.txt

5行目から20行目までを削除する

# sed -i '5,20d' file.txt

13行目以降を削除する

# sed -i '13,$d' file.txt

「pattern」を含む行を削除する

# sed -i '/pattern/d' file.txt

空行を削除する

# sed -i '/^$/d' file.txt

テキストファイルの指定した行のみを出力する

5行目のみを出力する

# sed -n 5p file.txt

テキストファイルの行頭,行末に文字列を追加する

行頭に「"」を追加する

# sed -i 's/^/"/g' file.txt

行末に「"」を追加する

# sed -i 's/$/"/g' file.txt

文字列「AAAA」を含む行の行頭に「;」を追加する

# sed -i '/AAAA/s/^/;/g' file.txt

テキストファイルを行単位で並べ替える

sort コマンド

オプション
-n:数値として並べ替える。
-r:降順に並べ替える。(指定しない場合は昇順)
-t 文字:指定文字を区切り文字とする。(デフォルトは空白)
-k 数値1(,数値2):数値1番目のフィールドから数値2番目のフィールドをキーとする。(先頭フィールドは1)

# cat list.txt yuna 95 runa 32 honoka 44 hinata 74 mao 19 haruna 89 kanon 65 mana 55 haruka 100 nanami 82

に対して、

# sort -n -r -k 2,2 list.txt haruka 100 yuna 95 haruna 89 nanami 82 hinata 74 kanon 65 mana 55 honoka 44 runa 32 mao 19

# sort -k 1,1 list.txt haruka 100 haruna 89 hinata 74 honoka 44 kanon 65 mana 55 mao 19 nanami 82 runa 32 yuna 95

複数の列をもとにデータを並べ替える

# cat list.txt yuna 5 runa 2 honoka 3 hinata 3 mao 1 haruna 4 kanon 3 mana 3 haruka 5 nanami 4

に対して、
第2フィールドを数値として降順に並べ替え、同じになったものを第1フィールドで並べ替える

# sort -k 2nr,2 -k 1,1 list.txt haruka 5 yuna 5 haruna 4 nanami 4 hinata 3 honoka 3 kanon 3 mana 3 runa 2 mao 1

フィールド,カラムを取り出して表示する

cut コマンド

オプション
-c 位置:取り出すカラムの位置を指定する。(複数指定可、範囲指定可)
-f 位置:取り出すフィールドの位置を指定する。(複数指定可、範囲指定可)
-d 区切り文字:フィールドの区切り文字を指定する。

最初の3文字を出力する。

# cut -c1-3 list.txt

ファイルの各行のスペースで区切られた2番目のフィールドを切り出す。

# cut -d' ' -f2 list.txt

連続したスペースで区切られたフィールドを取り出して表示する

awk コマンド

awk コマンドでは連続した空白は一つの区切りとして扱われる。
3つ目の区切られているフィールドを取り出す。

# awk '{print $3}' list.txt

数値計算をする

# echo "scale=2; 10/3 + 0.1" | bc 3.43

scale=桁:割り算で小数点以下の桁数を指定する。初期値は0。
割り算でないと桁数の指定は効かない。

# echo "scale=2; 5.432 + 3.1" | bc 8.532

# echo "scale=2; (5.432 + 3.1)/1" | bc 8.53

計算途中でも小数点以下を切り捨ててしまう。例えば、「1/2*2」の結果は1ではなく、0になる。

# echo "1/2 * 2" | bc 0

1未満の整数部分の0は表示されない。(マイナスも同様)

# echo "scale=2; 1/2" | bc .50 # echo "scale=2; -1/2" | bc -.50

0が必要ならば以下のようにする。

# echo "scale=2; 1/2" | bc |sed -e 's/^\./0\./' | sed -e 's/^-\./-0\./' 0.50

縦計を計算する

# cat sample.txt 1 4 2 5 3 6

1列目の合計を出す。

# awk '{s += $1} END {print s}' < sample.txt 6

1列目と2列目の合計を出す。

# awk '{a += $1; b += $2} END {print a, b}' < sample.txt 6 15

テキストファイルの内容を逆順に表示

tac コマンド
テキストファイルの内容を区切り文字を基準に逆順に表示する。
デフォルトでは区切り文字は改行文字なので行単位で逆順に表示される。

# tac file.txt

オプション
-s 区切り文字:区切り文字を指定する。


連続する同じ内容の行をまとめる

uniq コマンド
連続する同じ行がある場合それらを削除して表示することができる。
オプションを使用することで、いろいろな表示方法を選べる。

# cat sample.txt Hello World ! Hello World ! Hello World ! Hello World ! How are you ?

に対して

連続する行をまとめて表示

# uniq sample.txt Hello World ! How are you ?

連続する同じ行がいくつあるか表示

# uniq -c sample.txt 4 Hello World ! 1 How are you ?

連続する同じ行のみ表示

# uniq -d sample.txt Hello World !

1度しか現れない行のみ表示

# uniq -u sample.txt How are you ?

- guitar site WAVE -