中級者のためのLinuxコマンド入門

コマンド&スクリプト

プログラミングもできるようになって、GUIだけじゃなくてCUIの意味がわかるようになった人。
もう初心者卒業なのかもな人。もう少しステップアップしたい中級者プログラマー。いやいやプログラミングとかどうでもいいからさくっとコマンドで処理したいだけな人。

はたまたまったくの初心者。
いろんなコマンド好きに向けて、コマンド入門記事を作成中です。

ほぼ毎日更新で、分かりやすい記事に仕上げていくつもりです。

使用するDistributionは、Debianです。

Contents

スポンサーリンク

1.Linuxコマンド 入門

端末エミュレータ、ウィンドウ

xterm
uxterm

Shell(シェル)

sh
bash
csh
zsh

ターミナル操作

(C-a/e/f/b)カーソル移動

Ctrl + a カーソルが行頭に移動します。
Ctrl + b カーソルが1文字左に移動します。
Ctrl + f カーソルが1文字右に移動します。
Ctrl + e カーソルが行末に移動します。

(C-n/p) コマンド履歴呼び出し

Ctrl + p コマンド履歴を上に移動します。
Ctrl + n コマンド履歴の下に移動します。

(C-h/u) 文字削除

Ctrl + h カーソルの文字を1文字削除します。
Ctrl + u カーソルから行頭まで削除します。

(C-l) 画面をクリア

Ctrl + lキーで、ターミナル画面をクリアします。
clearコマンドでも同様です。

Bash変数

$PS1 プライマリープロンプト

takk~$ PS1='AAA $ '
AAA $ echo $PS1
AAA $
AAA $

$PS2 セカンドプロンプト

takk~$ echo $PS2
>
takk~$ echo "
> HELLO
> "

HELLO

takk~$ PS2='>>>>>'
takk~$ echo "
>>>>>HELLO
>>>>>"

HELLO

takk~$

!^ 直前コマンドの最初の引数

takk~$ echo !^
echo 10
10
takk~$

!$ 直前コマンドの最後の引数

takk~$ echo 10 20 30
10 20 30
takk~$ echo !$
echo 30
30
takk~$

!:N 直前コマンドのN番目の引数

takk~$ echo !:2
echo 20
20
takk~$

!* 直前コマンドのすべての引数

takk~$ echo 10 20 30
10 20 30
takk~$ echo !*
echo 10 20 30
10 20 30
takk~$

$$ 実行中プロセスのID

takk~$ echo $$
18371
takk~$ ps
  PID TTY          TIME CMD
17790 pts/1    00:00:00 sh
18371 pts/1    00:00:00 bash
18380 pts/1    00:00:00 ps
takk~$

$RANDOM 乱数

takk~$ echo $RANDOM
2686
takk~$ echo $RANDOM
25952
takk~$

$OLDPWD 前回のディレクトリ

takk~$ cd aa/bb/cc
takk~/aa/bb/cc$ echo $OLDPWD
/home/takk
takk~/aa/bb/cc$ cd $OLDPWD
takk~$ echo $OLDPWD
/home/takk/aa/bb/cc
takk~$ cd $OLDPWD
takk~/aa/bb/cc$

$SHELL 現在のシェル

起動中のシェルを表示します。

takk~$ echo $SHELL
/bin/sh
takk~$ 

$SHLVL シェルレベル(シェルの深さ)

ログイン直後のレベルは1です。さらにbashを実行するとレベルアップし、exitでbashを抜けるとレベルダウンします。

Linux 192-168-0-12 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon Aug 24 22:09:07 2020 from 192.168.0.11
takk~$ echo $SHLVL
1
takk~$
takk~$ echo $SHLVL
2
takk~$ bash
takk~$ bash
takk~$ echo $SHLVL
4
takk~$ exit
exit
takk~$ exit
exit
takk~$ exit
exit
takk~$ echo $SHLVL
1
takk~$

hisotry コマンド履歴

コマンド履歴表示

引数なしでhistoryコマンドを実行すると、コマンド履歴を表示します。

takk~$ mkdir tmp
takk~$ cd !$
cd tmp
takk~/tmp$ cd -
/home/takk
takk~$
takk~$ history
    1  mkdir tmp
    2  cd tmp
    3  cd -
    4  history
takk~$

4行目にhistoryコマンドが表示されていますが、実際は記録されません。

takk~$ history
    1  mkdir tmp
    2  cd tmp
    3  cd -
    4  history
takk~$ history
    1  mkdir tmp
    2  cd tmp
    3  cd -
    4  history
takk~$

-c コマンド履歴クリア

takk~$ history -c
takk~$ history
    1  history
takk~$

HISTSIZE コマンド履歴サイズ

takk~$ HISTSIZE=3
takk~$ echo no1
no1
takk~$ echo no2
no2
takk~$ history
   27  echo no1
   28  echo no2
   29  history
takk~$

HISTIGNORE 非履歴コマンド

HISTIGNOREに履歴に載せないコマンドを:(コロン)で区切って指定します。
コマンド行が完全一致した場合のみ、履歴対象外となります。

下記では、echo AAは履歴されますが、echoとlsは履歴に記録されない結果となっています。

takk~$ HISTIGNORE=echo:ls
takk~$ echo AA
AA
takk~$ echo

takk~$ ls
tmp
takk~$ history
   38  HISTIGNORE=echo:ls
   39  echo AA
   40  history
takk~$

関連記事はコチラ
historyコマンドはいつ使うのか

echo 文字列表示

echo [オプション]… [文字列]…

echoは、引数で与えた文字列を表示するコマンドです。

takk~$ echo HELLO
HELLO
takk~$ echo HELLO SEE YOU
HELLO SEE YOU
takk~$

-nを指定すると、文字列最後の改行を表示しません。

takk~$ echo -n HELLO;echo -n HELLO
HELLOHELLOtakk~$

echoだけ実行すると改行ができます。

takk~$ echo

takk~$

-eオプションはバックスラッシュによるエスケープ文字を許可します。改行等含む文字列を表示するときに使います。

takk~$ echo -e "HELLO\nHELLO"
HELLO
HELLO
takk~$

関連記事はこちら
コマンドラインのHello World

for 繰り返し

bashの組み込みコマンドです。
いわゆるforeachと範囲を指定する二つの繰り返し方法があります。

for 変数 in リスト

for name [ in [word …]]; do list ;done

takk~$ for i in AA BB CC;do echo $i;done
AA
BB
CC
takk~$

for ((;;))

for (( expr1 ; expr 2 ; expr3 )) ; do list ; done

takk~$ for((i=0;i<3;i++));do echo $i;done
0
1
2
takk~$

forコマンドは空白を入れても認識しますが、2連続の((や))は、空白を入れるとエラーになります。

関連記事はコチラ
Bashでコンソールプログレスバー

2.ディレクトリ、ファイルの役割

/bin 基本コマンドディレクトリ

takk~$ ls /bin
GET HEAD POST R X11 [ apt ar arch as awk bash bc c++ c89 c99 cal cat
cc chfn chrt chsh chvt cmp col comm cp cpan cpio cpp cut dash date dc
dd derb df diff dir dpkg du dwp echo ed edit env epmd eqn erl erlc ex
expr f77 f95 file find fmt fold free from g++ gawk gcc gcov geqn git
gold gosh gpg gpgv gpic grep grog gtbl gzip h2ph h2xs hd head host i386
id ip ipcs java jfr jjs join kill kmod last lcf ld ldd less lft link ln
look ls lsns lsof luit lzma make man mawk mesg more mt mv nano nawk nc
ncal neqn nice nkf nl nm ntpq od pdb pdb2 pdb3 perf perl pic pico ping
pldd pmap pr ps ptar ptx pwd pwdx rcp rdma red rev rm rmid rsh rvim scp
sed see seq sftp sg sh shuf size slib sntp sort sq ss ssh stat stty su
sudo sum sync tabs tac tail tar tbl tee test tic toe top tput tr true
tset tty ucf ucfq ucfr ul uniq unsq unxz vdir vi view vim w wall wc wget
who xev xfd xrdb xset xxd xz yes zcat zcmp zip znew
takk~$

/sbin スーパーユーザーコマンドディレクトリ

takk~$ ls /sbin | sed -ne '/^.\{1,7\}$/p' | fmt
acpid adduser agetty arp arpd blkid blkzone bridge capsh cfdisk cgdisk
chcpu chmem chroot cpgr cppw cron debugfs deluser depmod devlink dmsetup
dmstats e2fsck e2image e2label e2undo e4crypt ethtool fdisk findfs fsck
fstrim gdisk gencmn genl getcap getty grpck grpconv halt hdparm hwclock
icupkg ifdown ifquery ifup init insmod ip ipmaddr isosize kbdrate kpartx
logsave losetup lsmod mke2fs mkfs mkswap modinfo mysqld nameif nologin
ntpd ntpdate ntptime parted pwck pwconv qemu-ga rarp raw reboot rmmod
rmt rmt-tar route rtacct rtcwake rtmon runuser service setcap sfdisk
sgdisk sshd sulogin swapoff swapon sysctl tarcat tc telinit tipc tune2fs
udevadm useradd userdel usermod vconfig vcstime vigr vipw visudo wipefs
zic zramctl
takk~$

/etc (エトセトラ)ディレクトリ

/etc/debian_version Debianバージョン

takk~$ cat /etc/debian_version
10.3
takk~$

/etc/shells 可能なシェル一覧

takk~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
takk~$ 

/etc/passwd ユーザ情報

takk~$ grep takk /etc/passwd
takk:x:1000:1000::/home/takk:/bin/sh
takk~$

/etc/group グループ情報

takk~$ grep takk /etc/group
sudo:x:27:takk
takk:x:1000:
takk~$

/etc/skel 新規ユーザディレクトリ構成

新規ユーザ作成時に、ユーザのホームディレクトリに、本ディレクトリの構成がコピーされます。

takk~$ find /etc/skel
/etc/skel
/etc/skel/.bash_logout
/etc/skel/.profile
/etc/skel/.bashrc
takk~$

/etc/issue ログインメッセージ

ログインセッション時のメッセージを格納するファイルです。

takk~$ cat /etc/issue
Debian GNU/Linux 10 \n \l

/etc/motd ログイン後メッセージ

ログイン成功後に表示するメッセージを格納するファイルです。

takk~$ cat /etc/motd

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
takk~$

/etc/ssh/sshd_config SSHサーバー設定

SSHサーバー(sshデーモン)の設定ファイルです。

takk~$ head /etc/ssh/sshd_config
#       $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
takk~$

/etc/ssh/ssh_config SSHクライアント設定

SSHクライアントの各ユーザー共通の設定ファイルです。

takk~$ head /etc/ssh/ssh_config

# This is the ssh client system-wide configuration file.  See
# ssh_config(5) for more information.  This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
#  1. command line options
#  2. user-specific file
#  3. system-wide file
takk~$

/etc/sudoers sudo設定ファイル

/etc/sudoersは、visudoコマンドで編集します。

root~# visudo
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root	ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command
%sudo	ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

/dev(デバイス)ディレクトリ

/dev/null nullデバイス

あらゆるデータの入力を破棄するファイル。

takk~$ echo HELLO > /dev/null
takk~$ cat /dev/null
takk~$

関連記事はコチラ
読み込みバッファサイズ

/dev/zero ゼロ読み出しファイル

ゼロ(0x00)を読み出せるスペシャルファイル。

takk~$ cat /dev/zero | dd bs=1 count=10 | hd
10+0 レコード入力
10+0 レコード出力
00000000  00 00 00 00 00 00 00 00  00 00                    |..........|
0000000a
10 bytes copied, 0.00112525 s, 8.9 kB/s
takk~$

関連記事はコチラ
ゼロのマニュアル

/dev/urandom 乱数読み出しファイル

乱数を読み出せるスペシャルファイル。

takk~$ cat /dev/urandom | dd bs=1 count=10 | hd
10+0 レコード入力
10+0 レコード出力
00000000  e3 b7 aa 47 19 16 41 0c  1f ff                    |...G..A...|
0000000a
10 bytes copied, 0.00169024 s, 5.9 kB/s
takk~$

関連記事はコチラ
zipsplitコマンド

/proc(プロセス)ディレクトリ

/proc/cpuinfo CPU情報

takk~$ cat /proc/cpuinfo
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz
stepping	: 2
microcode	: 0x1
cpu MHz		: 2294.686
cache size	: 4096 KB
physical id	: 0
siblings	: 1
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single pti fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs itlb_multihit
bogomips	: 4589.37
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

takk~$

/proc/interrupts IRQ情報

takk~$ cat /proc/interrupts
           CPU0
  0:          6   IO-APIC   2-edge      timer
  1:          9   IO-APIC   1-edge      i8042
  4:       2442   IO-APIC   4-edge      ttyS0
  6:          3   IO-APIC   6-edge      floppy
  8:          0   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 11:     552479   IO-APIC  11-fasteoi   uhci_hcd:usb1, virtio3
 12:         15   IO-APIC  12-edge      i8042
 14:          0   IO-APIC  14-edge      ata_piix
 15:    5480898   IO-APIC  15-edge      ata_piix
 24:          0   PCI-MSI 81920-edge      virtio2-config
 25:    2947679   PCI-MSI 81921-edge      virtio2-req.0
 26:          0   PCI-MSI 49152-edge      virtio0-config
 27:  100253932   PCI-MSI 49153-edge      virtio0-input.0
 28:        175   PCI-MSI 49154-edge      virtio0-output.0
 29:          0   PCI-MSI 65536-edge      virtio1-config
 30:         17   PCI-MSI 65537-edge      virtio1-virtqueues
NMI:          0   Non-maskable interrupts
LOC:  267934518   Local timer interrupts
SPU:          0   Spurious interrupts
PMI:          0   Performance monitoring interrupts
IWI:          0   IRQ work interrupts
RTR:          0   APIC ICR read retries
RES:          0   Rescheduling interrupts
CAL:          0   Function call interrupts
TLB:          0   TLB shootdowns
TRM:          0   Thermal event interrupts
THR:          0   Threshold APIC interrupts
DFR:          0   Deferred Error APIC interrupts
MCE:          0   Machine check exceptions
MCP:      17747   Machine check polls
HYP:          0   Hypervisor callback interrupts
HRE:          0   Hyper-V reenlightenment interrupts
HVS:          0   Hyper-V stimer0 interrupts
ERR:          0
MIS:          0
PIN:          0   Posted-interrupt notification event
NPI:          0   Nested posted-interrupt event
PIW:          0   Posted-interrupt wakeup event
takk~$

/proc/meminfo メモリ情報

takk~$ cat /proc/meminfo
MemTotal:         493296 kB
MemFree:           53048 kB
MemAvailable:     417304 kB
Buffers:          132480 kB
Cached:           199624 kB
SwapCached:          796 kB
Active:           262516 kB
Inactive:          89312 kB
Active(anon):      15096 kB
Inactive(anon):     9768 kB
Active(file):     247420 kB
Inactive(file):    79544 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2077768 kB
Dirty:                20 kB
Writeback:             0 kB
AnonPages:         19192 kB
Mapped:            18336 kB
Shmem:              5140 kB
Slab:              72784 kB
SReclaimable:      49808 kB
SUnreclaim:        22976 kB
KernelStack:        1136 kB
PageTables:          988 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2343796 kB
Committed_AS:     121936 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:              552 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      477176 kB
DirectMap2M:       47104 kB
DirectMap1G:           0 kB
takk~$

/proc/ioports I/O情報

takk~$ cat /proc/ioports
0000-0000 : PCI Bus 0000:00
  0000-0000 : dma1
  0000-0000 : pic1
  0000-0000 : timer0
  0000-0000 : timer1
  0000-0000 : keyboard
  0000-0000 : keyboard
  0000-0000 : rtc0
  0000-0000 : dma page reg
  0000-0000 : pic2
  0000-0000 : dma2
  0000-0000 : fpu
  0000-0000 : 0000:00:01.1
    0000-0000 : ata_piix
  0000-0000 : 0000:00:01.1
    0000-0000 : ata_piix
  0000-0000 : serial
  0000-0000 : 0000:00:01.1
    0000-0000 : ata_piix
  0000-0000 : vga+
  0000-0000 : floppy
  0000-0000 : floppy
  0000-0000 : 0000:00:01.1
    0000-0000 : ata_piix
  0000-0000 : floppy
  0000-0000 : serial
  0000-0000 : 0000:00:01.3
    0000-0000 : ACPI PM1a_EVT_BLK
    0000-0000 : ACPI PM1a_CNT_BLK
    0000-0000 : ACPI PM_TMR
  0000-0000 : 0000:00:01.3
    0000-0000 : piix4_smbus
0000-0000 : PCI conf1
0000-0000 : PCI Bus 0000:00
  0000-0000 : ACPI GPE0_BLK
  0000-0000 : 0000:00:05.0
    0000-0000 : virtio-pci-legacy
  0000-0000 : 0000:00:01.2
    0000-0000 : uhci_hcd
  0000-0000 : 0000:00:03.0
    0000-0000 : virtio-pci-legacy
  0000-0000 : 0000:00:04.0
    0000-0000 : virtio-pci-legacy
  0000-0000 : 0000:00:06.0
    0000-0000 : virtio-pci-legacy
  0000-0000 : 0000:00:01.1
    0000-0000 : ata_piix
takk~$

/proc/stat システム統計情報

takk~$ cat /proc/stat
cpu  24029765 3277 4049935 618707107 113209 0 75884 57289 0 0
cpu0 24029765 3277 4049935 618707107 113209 0 75884 57289 0 0
intr 528063188 6 9 0 0 2442 0 3 0 0 0 0 648158 15 0 0 6430092 0 0 0 0 0 0 0 0 0 3412550 0 143465764 571 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 926394244
btime 1586266441
processes 1589781
procs_running 2
procs_blocked 0
softirq 744913582 0 357269988 982767 143664809 0 0 36 0 279 242995703
takk~$

/proc/filesystems 対応ファイルシステムのリスト

takk~$ cat /proc/filesystems
nodev	sysfs
nodev	rootfs
nodev	ramfs
nodev	bdev
nodev	proc
nodev	cpuset
nodev	cgroup
nodev	cgroup2
nodev	tmpfs
nodev	devtmpfs
nodev	debugfs
nodev	tracefs
nodev	securityfs
nodev	sockfs
nodev	dax
nodev	bpf
nodev	pipefs
nodev	hugetlbfs
nodev	devpts
nodev	mqueue
nodev	pstore
	ext3
	ext2
	ext4
nodev	autofs
	iso9660
nodev	binfmt_misc
takk~$

/proc/version バージョン情報

takk~$ cat /proc/version
Linux version 4.19.0-8-amd64 (debian-kernel@lists.debian.org) (gcc version 8.3.0 (Debian 8.3.0-6)) #1 SMP Debian 4.19.98-1 (2020-01-26)
takk~$

/usr ディレクトリ

/usr/include ヘッダファイル

本ディレクトリに、いろんなヘッダファイルが格納されています。

takk~$ find /usr/include -name 'stdio.h'
/usr/include/c++/8/tr1/stdio.h
/usr/include/x86_64-linux-gnu/bits/stdio.h
/usr/include/stdio.h
takk~$

/usr/src/linux カーネルソース

Linuxのソースの格納場所です。

関連記事はコチラ
/usr/src/linuxの謎

/usr/share/zoneinfo

ゾーン情報が格納してあるディレクトリです。

takk~$ ls /usr/share/zoneinfo | pr -t5
Africa        EST           HST           NZ            US
America       EST5EDT       Hongkong      NZ-CHAT       UTC
Antarctica    Egypt         Iceland       Navajo        Universal
Arctic        Eire          Indian        PRC           W-SU
Asia          Etc           Iran          PST8PDT       WET
Atlantic      Europe        Israel        Pacific       Zulu
Australia     Factory       Jamaica       Poland        iso3166.tab
Brazil        GB            Japan         Portugal      leap-seconds.
CET           GB-Eire       Kwajalein     ROC           localtime
CST6CDT       GMT           Libya         ROK           posix
Canada        GMT+0         MET           Singapore     posixrules
Chile         GMT-0         MST           SystemV       right
Cuba          GMT0          MST7MDT       Turkey        zone.tab
EET           Greenwich     Mexico        UCT           zone1970.tab
takk~$

日本(東京)「Tokyo」ファイルは、アジア圏のディレクトリ「/usr/share/zoneinfo/Asia」内に納められています。

takk~$ ls /usr/share/zoneinfo/Asia | pr -t5
Aden          Chongqing     Jerusalem     Novokuznetsk  Tashkent
Almaty        Chungking     Kabul         Novosibirsk   Tbilisi
Amman         Colombo       Kamchatka     Omsk          Tehran
Anadyr        Dacca         Karachi       Oral          Tel_Aviv
Aqtau         Damascus      Kashgar       Phnom_Penh    Thimbu
Aqtobe        Dhaka         Kathmandu     Pontianak     Thimphu
Ashgabat      Dili          Katmandu      Pyongyang     Tokyo
Ashkhabad     Dubai         Khandyga      Qatar         Tomsk
Atyrau        Dushanbe      Kolkata       Qostanay      Ujung_Pandang
Baghdad       Famagusta     Krasnoyarsk   Qyzylorda     Ulaanbaatar
Bahrain       Gaza          Kuala_Lumpur  Rangoon       Ulan_Bator
Baku          Harbin        Kuching       Riyadh        Urumqi
Bangkok       Hebron        Kuwait        Saigon        Ust-Nera
Barnaul       Ho_Chi_Minh   Macao         Sakhalin      Vientiane
Beirut        Hong_Kong     Macau         Samarkand     Vladivostok
Bishkek       Hovd          Magadan       Seoul         Yakutsk
Brunei        Irkutsk       Makassar      Shanghai      Yangon
Calcutta      Istanbul      Manila        Singapore     Yekaterinburg
Chita         Jakarta       Muscat        Srednekolymsk Yerevan
Choibalsan    Jayapura      Nicosia       Taipei
takk~$

/usr/share/dict/words 単語ファイル

英語なら英単語が格納されている、10万行のファイルです。

takk~$ wc -l /usr/share/dict/words
102401 /usr/share/dict/words
takk~$ shuf !$ | head
shuf /usr/share/dict/words | head
appease
melds
partisanship
herdsman's
rut's
undershoots
lamps
sleigh's
draconian
pummels
takk~$

/usr/share/dict/wordsはシンボリックリンクとなっています。

takk~$ namei /usr/share/dict/words
f: /usr/share/dict/words
 d /
 d usr
 d share
 d dict
 l words -> /etc/dictionaries-common/words
   d /
   d etc
   d dictionaries-common
   l words -> /usr/share/dict/american-english
     d /
     d usr
     d share
     d dict
     - american-english
takk~$

関連記事はコチラ
ドイツ語版/usr/share/dict/words
ランダムな単語を得る(sed内でbash変数を使う)

3.ファイル・ディレクトリ関連コマンド

ls ディレクトリ内容の表示

ls [オプション]… [文字列]…

ls -l 詳細リスト形式で表示

takk~$ ls -l
total 16
-rw-r--r-- 1 takk takk 5 Jun  3 21:20 aa
-rw-r--r-- 1 takk takk 7 Jun  6 19:57 bb
-rw-r--r-- 1 takk takk 3 Jun  4 20:00 cc
-rw-r--r-- 1 takk takk 2 Jun  3 21:21 dd
takk~$

ls -t ファイル更新が新しい順

-tオプションをつけると更新日時が新しい順で表示されます。

takk~$ ls -t
bb  cc  dd  aa
takk~$

-tに、-lオプションを併用してみます。

takk~$ ls -lt
total 16
-rw-r--r-- 1 takk takk 7 Jun  6 19:57 bb
-rw-r--r-- 1 takk takk 3 Jun  4 20:00 cc
-rw-r--r-- 1 takk takk 2 Jun  3 21:21 dd
-rw-r--r-- 1 takk takk 5 Jun  3 21:20 aa
takk~$

ls -S ファイルサイズが大きい順

-Sが大文字であることに注意してください。
ファイルのサイズが大きいものから表示します。

takk~$ ls -S
bb  aa  cc  dd
takk~$ ls -Sl
total 16
-rw-r--r-- 1 takk takk 7 Jun  6 19:57 bb
-rw-r--r-- 1 takk takk 5 Jun  3 21:20 aa
-rw-r--r-- 1 takk takk 3 Jun  4 20:00 cc
-rw-r--r-- 1 takk takk 2 Jun  3 21:21 dd
takk~$

ls -g 詳細リスト(所有者非表示)

所有者が自分の時など、分かりきっているときはわざわざ二箇所に同じユーザ表示しなくてもよいですよね。
-gオプションを使うと、所有者を非表示で詳細一覧します。

takk~$ ls -g
total 16
-rw-r--r-- 1 takk 5 Jun  3 21:20 aa
-rw-r--r-- 1 takk 7 Jun  6 19:57 bb
-rw-r--r-- 1 takk 3 Jun  4 20:00 cc
-rw-r--r-- 1 takk 2 Jun  3 21:21 dd
takk~$

ls -a 隠しファイル表示

lsに-aオプションを指定すると、.(ドット)から始まるファイルも表示します。

takk~$ ls
aa  bb  cc  dd
takk~$ ls -a
.   .bash_history  bb       dd          .lesshst  .ssh  .viminfo
..  .bash_logout   cc       .gitconfig  .local    .tmp
aa  .bashrc        .config  .gnupg      .profile  .vim
takk~$

ls -i inodeを表示

takk~$ ls -i
1320725 aa  1320735 bb  1320727 cc  1320730 dd
takk~$ ls -il
total 16
1320725 -rw-r--r-- 1 takk takk 5 Jun  3 21:20 aa
1320735 -rw-r--r-- 1 takk takk 7 Jun  6 19:57 bb
1320727 -rw-r--r-- 1 takk takk 3 Jun  4 20:00 cc
1320730 -rw-r--r-- 1 takk takk 2 Jun  3 21:21 dd
takk~$

関連記事はコチラ
lsしたのに汽車が走った〜ミスタッチしやすいコマンドとは〜
LS-Dでぶっとぶ(lsコマンドでディレクトリのみ表示)

mkdir ディレクトリ作成

mkdir [オプション]… ディレクトリ…

mkdirの引数にディレクトリ名を与えれば、ディレクトリが作成できます。

takk~$ mkdir tmp
takk~$ ls -l
合計 4
drwxr-xr-x 2 takk takk 4096  3月 29 20:25 tmp
takk~$

ディレクトリは複数指定することができます。

takk~$ mkdir tmp2 tmp3
takk~$ ls -l
合計 12
drwxr-xr-x 2 takk takk 4096  3月 29 20:25 tmp
drwxr-xr-x 2 takk takk 4096  3月 29 20:27 tmp2
drwxr-xr-x 2 takk takk 4096  3月 29 20:27 tmp3
takk~$

cd ディレクトリ変更

cd [オプション] [ディレクトリ]

カレントディレクトリを変更するには、cdの引数にディレクトリを指定して実行すればよいです。

takk~$ cd tmp
takk~/tmp$

cd ホームディレクトリへ

引数を指定せずcdだけ実行するとホームディレクトリに変更できます。

takk~/tmp$ cd
takk~$

cd – 前回のディレクトリへ

引数に-(ハイフン)を指定すると、前回のディレクトリへ変更します。

takk~$ cd -
/home/takk/tmp
takk~/tmp$

cd 存在しないディレクトリ

存在しないディレクトリを指定するとエラーメッセージを表示して、カレントディレクトリはそのままです。

takk~$ cd test
bash: cd: test: そのようなファイルやディレクトリはありません
takk~$

cd 複数指定した場合

複数ディレクトリを指定しても、2番目以降は無効です。

takk~$ cd tmp2 tmp3
takk~/tmp2$

関連記事はこちら
スマートにcdを使う(その1)

pwd カレントディレクトリ表示

少々覚えにくいコマンド名かと思います。何の略か知るのが一番覚えやすいと思いますが、ネットで探してもいろんな意見があるコマンドのようです。
作った人に聞くのが一番かと思いますが、いろんな人が手がけていそうなので、手っ取り早くソースを見てみると、
coreutilsのpwd.cの一行目に「/* pwd – print current directory」
とありますので、ここでは、print working directoryと覚えておきましょう。

では使ってみます。

takk~$ pwd
/home/takk
takk~$ mkdir -p a/b/c/d/e
takk~$ cd !$
cd a/b/c/d/e
takk~/a/b/c/d/e$ pwd
/home/takk/a/b/c/d/e
takk~/a/b/c/d/e$

カレントディレクトリはプロンプトで表示しているので、あまり必要にならないコマンドかもしれません。

basename パスからファイル名抽出

basename [オプション]… パス文字列
basename パス文字列 [拡張子]

パス文字列からディレクトリを除いたファイル名を抽出してくれるコマンドです。
実際に存在するパスである必要はありません。

ファイル名抽出

パスからディレクトリ部分を除いたファイル名を抽出してみます。

takk~$ basename aa/bb/cc.txt
cc.txt
takk~$

ディレクトリ部分はカットされ、ファイル名のみ抽出できました。

拡張子を除くファイル名

パスからディレクトリ部分を除き、さらにファイル名から拡張子を除いた文字列を抽出してみます。

takk~$ basename aa/bb/cc.txt .txt
cc
takk~$

basename使わず拡張子抽出

Bashであればコマンドを使わなくとも、パス文字列の解析はできます。

takk~$ a=aa/bb/cc.txt
takk~$ echo ${a##*.}
txt
takk~$

basename使わず拡張子を除く

使用場面としては、拡張子を変更する時とかですね。

takk~$ echo ${a//.*}
aa/bb/cc
takk~$

touch タイムスタンプ更新

touch [オプション]… ファイル…

touchはファイルのタイムスタンプを変更するコマンドです。
ただタイムスタンプを現在日時に更新するだけでなく、指定日時に変更したり、新規空ファイルを作成したりできるコマンドです。
単体で使うことより、他コマンドと連携して使うことが多いコマンドです。

touch 空ファイル生成

存在しないファイルを指定すると、新規に空ファイルを作成します。

takk~$ ls
takk~$ touch test.txt
takk~$ ls -l
合計 0
-rw-r--r-- 1 takk takk 0  4月  3 14:23 test.txt
takk~$

touch タイムスタンプ更新

存在するファイルを指定すると、タイムスタンプを現在日時に更新します。

takk~$ date
2020年  4月  3日 金曜日 14:26:46 JST
takk~$ touch test.txt
takk~$ ls -l
合計 0
-rw-r--r-- 1 takk takk 0  4月  3 14:26 test.txt
takk~$

touch -t 指定日時に更新

タイムスタンプを指定した日時に変更してみましょう。-tに続けて MMddhhmm(月日時分)を指定します。
(1月31日の12時30分に変更)

takk~$ touch -t01311230 test.txt
takk~$ ls -l
合計 0
-rw-r--r-- 1 takk takk 0  1月 31 12:30 test.txt
takk~$

関連記事はこちら
大量のファイル生成(seq/touch)

cat ファイル内容の連結表示

cat [オプション]… [ファイル]…

takk~$ echo AAA > test1.txt
takk~$ echo BBB > test2.txt
takk~$ ls -l
合計 8
-rw-r--r-- 1 takk takk 4  4月  3 15:19 test1.txt
-rw-r--r-- 1 takk takk 4  4月  3 15:19 test2.txt
takk~$

catの引数に2つのファイルを指定してみます。

takk~$ cat test1.txt test2.txt
AAA
BBB
takk~$

各ファイルの内容が連結されて表示されました。

ファイルを指定する順番を逆にすると、

takk~$ cat test2.txt test1.txt
BBB
AAA
takk~$

上下逆になりました。

同じファイル名を指定することもできます。

takk~$ cat test1.txt test2.txt test1.txt
AAA
BBB
AAA
takk~$

ファイルを連結して新しいファイルに書き込むには、>(リダイレクト)を使います。

takk~$ cat test1.txt test2.txt > test12.txt
takk~$ ls -l
合計 12
-rw-r--r-- 1 takk takk 4  4月  3 15:19 test1.txt
-rw-r--r-- 1 takk takk 8  4月  3 15:45 test12.txt
-rw-r--r-- 1 takk takk 4  4月  3 15:19 test2.txt
takk~$

ファイルを連結するのではなく、単純にファイルの内容を表示したいときにも使えます。
この使い方が一番多いかもしれません。

takk~$ cat test1.txt
AAA
takk~$

cat -n 番号付与

行番号を添えて内容を表示することもできます。-nオプションを使います。

takk~$ cat -n tmp.txt
     1	AAA
     2	BBB
     3
     4	DDD
     5	EEE
takk~$

cat -b 空行以外に番号付与

takk~$ cat -nb tmp.txt
     1	AAA
     2	BBB

     3	DDD
     4	EEE
takk~$

cp ファイルやディレクトリコピー

cp [オプション]… コピー元 コピー先
cp [オプション]… -t コピー先 コピー元

ファイルをコピーしてみます。
まずコピー元ファイルを用意。

takk~$ echo AAA > test1.txt
takk~$ ls -l
合計 4
-rw-r--r-- 1 takk takk 4  4月  3 16:28 test1.txt
takk~$

test1.txtをコピーしてtest2.txtを作ります。

takk~$ cp test1.txt test2.txt
takk~$ ls -l
合計 8
-rw-r--r-- 1 takk takk 4  4月  3 16:28 test1.txt
-rw-r--r-- 1 takk takk 4  4月  3 16:29 test2.txt
takk~$

コピーされました。内容も確認しておきましょう。

takk~$ cat test1.txt
AAA
takk~$ cat test2.txt
AAA
takk~$

内容は一致しました。

次はディレクトリをコピーしてみましょう。

takk~$ mkdir test1
takk~$ ls -l
合計 12
drwxr-xr-x 2 takk takk 4096  4月  3 16:42 test1
-rw-r--r-- 1 takk takk    4  4月  3 16:28 test1.txt
-rw-r--r-- 1 takk takk    4  4月  3 16:29 test2.txt
takk~$

ディレクトリtest1を作成しました。これをコピーしてtest2を作ります。

-rオプションは再帰コピーのオプションですが、ディレクトリコピーは、配下のファイルやディレクトリをコピーすることは分かりきってるので、ディレクトリコピーをする場合は、-rオプションは必須になります。

takk~$ cp -r test1 test2
takk~$ ls -l
合計 16
drwxr-xr-x 2 takk takk 4096  4月  3 16:42 test1
-rw-r--r-- 1 takk takk    4  4月  3 16:28 test1.txt
drwxr-xr-x 2 takk takk 4096  4月  3 16:48 test2
-rw-r--r-- 1 takk takk    4  4月  3 16:29 test2.txt
takk~$

mv ファイル移動、名前変更

mv [オプション]… 変更元 変更先
mv [オプション]… -t 変更先 変更元

まずはファイルを移動してみます。このようなディレクトリ構成のとき、

takk~$ ls -l
合計 16
drwxr-xr-x 2 takk takk 4096  4月  3 16:42 test1
-rw-r--r-- 1 takk takk    4  4月  3 16:28 test1.txt
drwxr-xr-x 2 takk takk 4096  4月  3 16:48 test2
-rw-r--r-- 1 takk takk    4  4月  3 16:29 test2.txt
takk~$

ファイルtest1.txtを、ディレクトリtest1の中へ移動してみます。

takk~$ mv test1.txt test1/
takk~$

これで移動できました。確認してみましょう。

takk~$ ls -l
合計 12
drwxr-xr-x 2 takk takk 4096  4月  3 17:17 test1
drwxr-xr-x 2 takk takk 4096  4月  3 16:48 test2
-rw-r--r-- 1 takk takk    4  4月  3 16:29 test2.txt

カレントディレクトリからはtest1.txtがいなくなっていますね。
そして、test1の中は、

takk~$ ls -l test1
合計 4
-rw-r--r-- 1 takk takk 4  4月  3 16:28 test1.txt
takk~$

test1.txtがあります。移動成功してますね。

xargs 標準入力を引数にしてコマンド実行

xargs [オプション] [コマンド]

コマンドの出力を、次のコマンドの引数にしたいときに使います。

takk~$ echo 10 | xargs seq
1
2
3
4
5
6
7
8
9
10
takk~$

関連記事
xargsのxの意味はexecuteかcrossか

ln ハード、シンボリックリンク

ln [オプション]… 対象 リンク名

ハードリンクやシンボリックリンクを作成するコマンドです。

ln ハードリンク

まずfile1.txtを作り、file2.txtというファイル名のハードリンクを作ってみます。

takk~$ ls
takk~$ echo AAA > file1.txt
takk~$ ln file1.txt file2.txt
takk~$ cat file2.txt
AAA
takk~$

現在file1.txtとfile2.txtの内容は同じになってますが、file2.txtの内容を変更するとどうなるでしょうか。

takk~$ echo BBB >> file2.txt
takk~$ cat file2.txt
AAA
BBB
takk~$

file2.txtを変更しました。file1.txtの内容を確認してみます。

takk~$ cat file1.txt
AAA
BBB
takk~$

同じですね。このようにハードリンクを作成すると、リンクしているファイルの内容が同じように書き換わります。
もう一つリンクを増やしてみます。

takk~$ cat file3.txt
AAA
BBB
takk~$

最初に作ったfile1.txtを消してみましょう。

takk~$ rm file1.txt
takk~$ cat file2.txt
AAA
BBB
takk~$ cat file3.txt
AAA
BBB
takk~$

file2.txtとfile3.txtは削除されることなく、中身も健在でした。

ln シンボリックリンク

シンボリックリンクを作るには、lnコマンドに-sオプションを指定します。

takk~$ ln -s file3.txt file4.txt
takk~$ ls
file2.txt  file3.txt  file4.txt
takk~$ cat file4.txt
AAA
BBB
takk~$

ぱっと見、ハードリンクとの違いが分かりませんが、ls -lでみると、シンボリックリンクはすぐわかります。

takk~$ ls -l
total 8
-rw-r--r-- 2 takk takk 8 Apr  8 00:49 file2.txt
-rw-r--r-- 2 takk takk 8 Apr  8 00:49 file3.txt
lrwxrwxrwx 1 takk takk 9 Apr  8 00:49 file4.txt -> file3.txt
takk~$

関連記事はこちら
実写のガミラス星人はハードリンクで作れると思った(ln)
マウントとシンボリックリンクのコピー

namei パス名を辿る

パス名の大元を辿れます。
/usr/bin/pythonのシンボリックリンクを辿ってみます。

takk~$ namei /usr/bin/python
f: /usr/bin/python
 d /
 d usr
 d bin
 l python -> python2
   l python2 -> python2.7
     - python2.7
takk~$

関連記事はコチラ
(Linux)nameiコマンドでシンボリックリンクを辿り続ける

4.ファイルの検査コマンド

wc 文字数、行数のカウント

wc [オプション]… [ファイル]…

ファイルの単語数や行数をカウントします。

このファイルは12行のテキストファイルです。

takk~$ cat -n file1.txt
     1	AAA
     2	BBB
     3	CCC
     4	DDD
     5	EEE
     6	FFF
     7	GGG
     8	HHH
     9	III
    10	JJJ
    11	KKK
    12	LLL MMM NNN
takk~$

これをwcでカウントすると、

takk~$ wc file1.txt
12 14 56 file1.txt
takk~$

ファイルの分析結果が表示されました。
左から、行数、単語数、バイト数、ファイル名です。

関連記事はコチラ
最も長い英単語は何か(wc/sed)

file ファイルタイプ確認

fileコマンドで、ファイルの種類を確認できます。
拡張子をつけずに、このようにファイルを作ったとします。

takk~$ echo HELLO > aaa
takk~$ ls
aaa
takk~$

aaaというファイルが作られましたが、今は作ったばかりだから覚えていて当然なんですが、拡張子がないとこれが何のファイルなのか忘れてしまいますね。
ファイルの種類を確認するコマンド、fileを使ってみましょう。

takk~$ file aaa
aaa: ASCII text
takk~$

ASCII textと表示されました。テキストファイル、かつASCIIコードが使用されています。
では、UTF8日本語の文字列をファイルに含ませてみます。

takk~$ echo あいう >> aaa
takk~$ file aaa
aaa: UTF-8 Unicode text
takk~$

fileコマンドで、UTF-8のUnicodeテキストファイルであることが確認できました。
次は、バイナリデータを含めてみましょうか。

takk~$ echo -e "\x01" >> aaa
takk~$ file aaa
aaa: data
takk~$

データであると認識されました。fileコマンドなかなか優秀です。

md5sum MD5メッセージダイジェスト

takk~$ echo HELLO | md5sum
0084467710d2fc9d8a306e14efbe6d0f  -
takk~$ echo HELLO > a.txt
takk~$ md5sum a.txt
0084467710d2fc9d8a306e14efbe6d0f  a.txt
takk~$

関連記事はコチラ
完全一致

sum チェックサム、ブロック数計算

takk~$ echo -ne "\x11\x22" > a.bin
takk~$ hd a.bin
00000000  11 22                                             |."|
00000002
takk~$ sum -s a.bin
51 1 a.bin
takk~$ 

関連記事はコチラ
(Linux)バイナリファイルのSUM

5.テキスト整形コマンド

nl 番号付与

nl [オプション]… [ファイル]…

番号を付けてくれるコマンドです。cat -nでも付けられるので、あまり出番がないかもしれません。
以下のような内容のファイルを使って、いろいろ番号を付けてみましょう。

takk~$ cat tmp.txt
AAA
BBB
CCC

DDD
EEE
takk~$

オプションを付けずに、ファイルのみ指定すると、このような表示になります。

takk~$ nl tmp.txt
     1	AAA
     2	BBB
     3	CCC

     4	DDD
     5	EEE
takk~$

cat -nも確認してみます。

takk~$ cat -n tmp.txt
     1	AAA
     2	BBB
     3	CCC
     4
     5	DDD
     6	EEE
takk~$

違いますね。nlはオプションなしで使用すると、空行に番号が付与されません。空行にも番号を付けるには-baオプションを指定します。

takk~$ nl -ba tmp.txt
     1	AAA
     2	BBB
     3	CCC
     4
     5	DDD
     6	EEE
takk~$

少しコマンド入力が長くなってしまうので、全行に番号をつけたいときは、cat -nってことですね。

nl -v 先頭数字の指定

nlの他のオプションの使い方も確認していきましょう。
-vオプションで最初の数字を指定できます。

takk~$ nl -v2 tmp.txt
     2	AAA
     3	BBB
     4	CCC

     5	DDD
     6	EEE
takk~$

nl -i ステップ値の指定

3つ飛ばしで番号を付けてみます。-iオプションを使います。

takk~$ nl -i3 tmp.txt
     1	AAA
     4	BBB
     7	CCC

    10	DDD
    13	EEE
takk~$

nl -s セパレータ

-sオプションで、付与番号と元テキストとのセパレータを変更できます。

takk~$ nl -s: tmp.txt
     1:AAA
     2:BBB
     3:CCC

     4:DDD
     5:EEE
takk~$

セパレータの指定は複数文字で大丈夫です。

takk~$ nl -s' >> ' tmp.txt
     1 >> AAA
     2 >> BBB
     3 >> CCC

     4 >> DDD
     5 >> EEE
takk~$

変数も使えます。

takk~$ nl -s" $PWD: " tmp.txt
     1 /home/takk: AAA
     2 /home/takk: BBB
     3 /home/takk: CCC

     4 /home/takk: DDD
     5 /home/takk: EEE
takk~$

nl -n アライン

-nで付与番号の書式を指定できます。
左詰めは、-nln

takk~$ nl -nln tmp.txt
1     	AAA
2     	BBB
3     	CCC

4     	DDD
5     	EEE
takk~$

右詰めで0埋するなら、-nrz tmp.txt

takk~$ nl -nrz tmp.txt
000001	AAA
000002	BBB
000003	CCC

000004	DDD
000005	EEE
takk~$

nl -w 桁数

桁数指定に加えて、分かりやすくなるように-nrzで0埋右詰で表示してみます。

takk~$ nl -w3 -nrz tmp.txt
001	AAA
002	BBB
003	CCC

004	DDD
005	EEE
takk~$

nl マッチ行に番号付与

正規表現でマッチする行のみ番号付与できます。

元ファイル

takk~$ cat -n tmp2.txt
     1	AAA,1234,xxxx-xxxx-xxxx
     2	BBBB,,xxxx-xxxx-xxxx
     3	,,xxxx-xxxx-xxxx
     4
     5	CCCC,,
     6	DDDD,123
takk~$

セクション指定(BODY)の-bオプションに続いて、「p正規表現」を指定すればよいです。
,(カンマ)を2つ含む行へのみ、番号付与してみます。

takk~$ nl -bp',.*,' tmp2.txt
     1	AAA,1234,xxxx-xxxx-xxxx
     2	BBBB,,xxxx-xxxx-xxxx
     3	,,xxxx-xxxx-xxxx

     4	CCCC,,
       DDDD,123
takk~$

tac テキストの上下反転

tac [オプション]… [ファイル]…

このファイルの内容を逆さまにしてみましょう。

takk~$ cat file.txt
AAA
BBB
CCC
DDD
EEE
takk~$

オプションなしでファイルを指定するだけです。

takk~$ tac file.txt
EEE
DDD
CCC
BBB
AAA
takk~$

関連記事はコチラ
perlとsedでtacする
(Linux)tacコマンド-sオプション

shuf テキストのシャッフル

shuf [オプション]… [ファイル]

トランプを切るようにテキストをシャッフルしてくれるコマンドです。
元のテキストはこれ。

takk~$ cat file.txt
AAA
BBB
CCC
DDD
EEE
takk~$

シャッフルすると、

takk~$ shuf file.txt
DDD
EEE
BBB
CCC
AAA
takk~$

当然結果は毎回変化します。

takk~$ shuf file.txt
EEE
CCC
BBB
DDD
AAA
takk~$

関連記事はコチラ
(Linux)シャッフルしてソート(shuf sortコマンド)
shufにナンバーズ3の番号を決めてもらう

rev テキストの左右反転

rev [オプション]… [ファイル]…

このファイルの内容を左右反転してみます。

takk~$ cat file.txt
abcde
fghij
klmno
pqrst
12345
67890
takk~$

tacと同じく引数にファイルを指定するだけです。

takk~$ rev file.txt
edcba
jihgf
onmlk
tsrqp
54321
09876
takk~$

特に難しいところはありませんね。

関連記事はコチラ
何に使うかわからないrevを使って文字コードチェック
何に使うかわからないrevを使って並び替えとニブルスワップ

head テキストの先頭抽出

head [オプション]… [ファイル]…

ファイルを指定すると、ファイルの1行目から10行目までを抽出します。

このようなファイルがあるとき、

takk~$ cat file1.txt
AAA
BBB
CCC
DDD
EEE
FFF
GGG
HHH
III
JJJ
KKK
LLL
takk~$

このファイルをheadの引数に与えると、

takk~$ head file1.txt
AAA
BBB
CCC
DDD
EEE
FFF
GGG
HHH
III
JJJ
takk~$

上から10行のみ抽出してくれます。

複数ファイルを指定すると、ヘッダにファイル名を表示します。

takk~$ head *.txt
==> file1.txt <==
AAA
BBB
CCC
DDD
EEE
FFF
GGG
HHH
III
JJJ

==> file2.txt <==
AAA
BBB
CCC
DDD
EEE
FFF
GGG
HHH
III
JJJ
takk~$

関連記事
headコマンド
headの意外な使い方

tail テキストの末尾抽出

tail [オプション]… [ファイル]…

headで使ったファイルfile1.txtをtailで使ってみます。

takk~$ tail file1.txt
CCC
DDD
EEE
FFF
GGG
HHH
III
JJJ
KKK
LLL
takk~$

関連記事はコチラ
headよりtailが遅い?

tr 文字変換、文字削除

tr [オプション]… 置換前文字列セット [置換後文字列セット]

tr 文字変換

takk~$ seq 6
1
2
3
4
5
6
takk~$
takk~$ seq 6 | tr 246 135
1
1
3
3
5
5
takk~$

tr -d 文字削除

-dオプションで指定した文字を削除できます。

takk~$ seq 6 | tr -d 25
1

3
4

6
takk~$

tr 範囲で指定する

-で範囲指定することもできます。

takk~$ echo -e $(printf "\\\x%x" `seq 65 89`)
ABCDEFGHIJKLMNOPQRSTUVWXY
takk~$ !! | tr A-L a-l
echo -e $(printf "\\\x%x" `seq 65 89`) | tr A-L a-l
abcdefghijklMNOPQRSTUVWXY
takk~$

sed ストリームエディタ

sed [オプション]… スクリプト [入力ファイル]…

-e’s///’ 置換

takk~$ cat -n a.txt
     1	AAA
     2	BBB
     3	CCC
     4	DDD
     5	EEE
takk~$ sed -e 's/CCC/C/' a.txt
AAA
BBB
C
DDD
EEE
takk~$

-ne ‘数字p’ 指定行のみ出力

takk~$ sed -ne '3p' a.txt
CCC
takk~$

関連記事はコチラ
sedの拡張正規表現を使う
(Linux)sedコマンドで破壊的置換(大量ファイル置換)
(Linux)headの代わりにsedやawkを使う(head sed awkの良いところ)
sedやperlの置換構文〜substitute(s///)
numfmtで付けたカンマはsedやawkで外す

uniq 重複行検出、重複行除外

uniq [オプション]… [入力]

重複行を発見、除外することができます。

takk~$ echo "AAA
> BBB
> BBB
> CCCC
> CCC
> CCC
> DDDDDD
> DDDDDD
> DDDDDD
> " > a.txt
takk~$ cat a.txt
  AAA
  BBB
  BBB
  CCCC
  CCC
  CCC
  DDDDDD
  DDDDDD
  DDDDDD

takk~$

この重複行だらけのa.txtにuniqをかけてみましょう。

uniq 重複行削除

takk~$ uniq a.txt
AAA
BBB
CCCC
CCC
DDDDDD

takk~$

uniq -c 重複行の検出、カウント

重複行を調べるには、重複行の数をカウントすればよいです。

takk~$ uniq -c a.txt
      1 AAA
      2 BBB
      1 CCCC
      2 CCC
      3 DDDDDD
      1
takk~$

uniq -D 重複行のみ表示

takk~$ uniq -D a.txt
BBB
BBB
CCC
CCC
DDDDDD
DDDDDD
DDDDDD
takk~$

関連記事はこちら
uniqコマンドでランレングス圧縮できるって本当?
pythonとuniqで英単語のアナグラムを見つける

expand タブ→スペース変換

takk~$ cat tab.txt
1234567 ABC
        ABC
1234    ABC
takk~$

上記はタブ入りのテキストファイルです。各行のABCの前には、タブ(コード09)があります。

takk~$ xxd tab.txt
00000000: 3132 3334 3536 3709 4142 430a 0941 4243  1234567.ABC..ABC
00000010: 0a31 3233 3409 4142 4309 0a              .1234.ABC..
takk~$

このテキストファイルのタブを、expandコマンドで、スペースに変換してみます。

takk~$ expand tab.txt
1234567 ABC
        ABC
1234    ABC
takk~$

見た目は変わってませんが、空欄部分は、すべてスペース(コード20)に置換されています。

takk~$ expand tab.txt | xxd
00000000: 3132 3334 3536 3720 4142 430a 2020 2020  1234567 ABC.
00000010: 2020 2020 4142 430a 3132 3334 2020 2020      ABC.1234
00000020: 4142 4320 2020 2020 0a                   ABC     .
takk~$

関連記事はコチラ
(Linux)expand/unexpand ソースコードのタブ変換
(Linux)expandのiオプションが何か分からない

unexpand スペース→タブ変換

unexpandは、expandの反対で、スペース(20)をタブ(09)に置換するコマンドです。
もちろん単純置換ではなく、文字の配置状況に合わせて置換されます。

以下のファイルの内容のうち、空欄部分はすべてスペース(20)です。

takk~$ cat space.txt
1234567 ABC
        ABC
1234    ABC
takk~$ xxd space.txt
00000000: 3132 3334 3536 3720 4142 430a 2020 2020  1234567 ABC.
00000010: 2020 2020 4142 430a 3132 3334 2020 2020      ABC.1234
00000020: 4142 4320 2020 2020 0a                   ABC     .
takk~$

unexpandでスペースタブ置換してみます。

takk~$ unexpand space.txt
1234567 ABC
        ABC
1234    ABC
takk~$
takk~$ unexpand space.txt | xxd
00000000: 3132 3334 3536 3720 4142 430a 0941 4243  1234567 ABC..ABC
00000010: 0a31 3233 3420 2020 2041 4243 2020 2020  .1234    ABC
00000020: 200a                                      .
takk~$

fmt テキストをフォーマット

fmt [-幅] [オプション]… []ファイル]…

テキストファイルの幅を揃える。
元ファイルの生成。

takk~$ seq 20 | perl -nE'say $_/0.8' | shuf > a.txt
takk~$ cat a.txt
20
3.75
8.75
21.25
18.75
13.75
25
15
7.5
12.5
5
22.5
6.25
10
17.5
11.25
16.25
2.5
1.25
23.75
takk~$

20カラムを指定します。

takk~$ fmt -w20 a.txt
20 3.75 8.75
21.25 18.75 13.75
25 15 7.5 12.5 5
22.5 6.25 10 17.5
11.25 16.25 2.5
1.25 23.75
takk~$

fold テキストを折りたたみ

fold [オプション]… [ファイル]…

-b バイト指定して折りたたみ

takk~$ seq -s, 100 | fold -b20
1,2,3,4,5,6,7,8,9,10
,11,12,13,14,15,16,1
7,18,19,20,21,22,23,
24,25,26,27,28,29,30
,31,32,33,34,35,36,3
7,38,39,40,41,42,43,
44,45,46,47,48,49,50
,51,52,53,54,55,56,5
7,58,59,60,61,62,63,
64,65,66,67,68,69,70
,71,72,73,74,75,76,7
7,78,79,80,81,82,83,
84,85,86,87,88,89,90
,91,92,93,94,95,96,9
7,98,99,100
takk~$

-s 空白で改行する

takk~$ seq -s' ' 100 | fold -sb20
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27
28 29 30 31 32 33
34 35 36 37 38 39
40 41 42 43 44 45
46 47 48 49 50 51
52 53 54 55 56 57
58 59 60 61 62 63
64 65 66 67 68 69
70 71 72 73 74 75
76 77 78 79 80 81
82 83 84 85 86 87
88 89 90 91 92 93
94 95 96 97 98 99
100
takk~$

paste ファイルを行毎に結合

paste [オプション]… [ファイル]…

ファイルを行単位で結合します。

takk~$ cat a.txt
A1
A2
A3
A4
A5
takk~$ cat b.txt
B1
B2
B3
B4
B5
takk~$ paste a.txt b.txt
A1	B1
A2	B2
A3	B3
A4	B4
A5	B5
takk~$

引数に指定する順序で、結合します。

takk~$ paste b.txt a.txt
B1	A1
B2	A2
B3	A3
B4	A4
B5	A5
takk~$

同じファイルを指定することもできます。

takk~$ paste a.txt b.txt a.txt
A1	B1	A1
A2	B2	A2
A3	B3	A3
A4	B4	A4
A5	B5	A5
takk~$

ファイルの行数を合わせなくても結合できます。

takk~$ cat c.txt
C1
C2
C3
takk~$ paste a.txt c.txt
A1	C1
A2	C2
A3	C3
A4
A5
takk~$ paste c.txt a.txt
C1	A1
C2	A2
C3	A3
	A4
	A5
takk~$

関連記事はコチラ
かえるの合唱(printerbanner)

cut 列の抽出

cut オプション… [ファイル]…

指定文字列をセパレータとして、テキストの列抽出をします。
区切り文字は-dで指定します。

takk~$ seq 10 49 | fmt -30 > a.txt
takk~$ cat a.txt
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
takk~$
takk~$ cut -d' ' -f1,2,7-9 a.txt
10 11 16 17 18
20 21 26 27 28
30 31 36 37 38
40 41 46 47 48
takk~$

関連記事はこちら
列の入れ替えはcutでできない、awkでできる
テキストの列フィルタ(cut)

split ファイル分割

split [オプション]… [ファイル [プリフィックス]]

ファイルを指定した方法で分割します。

takk~$ echo ABCDEFGHIJKLMN > a.bin
takk~$ split -b3 a.bin
takk~$ ls
a.bin  xaa  xab  xac  xad  xae
takk~$ cat xab
DEFtakk~$
takk~$

関連記事はコチラ
splitとpasteでXとYを入れ替える

printf 書式指定

takk~$ printf "%07.3f\n" 12.3
012.300
takk~$

6.検索コマンド

grep ファイル内の文字列検索

grep [オプション…] パターン [ファイル…]

takk~$ head *.txt
==> a.txt <==
AAA
BBB
CCC
DDD
EEE

==> b.txt <==
KKK
FFF
LLL
AAA
EEE
takk~$
takk~$ grep AAA *.txt
a.txt:AAA
b.txt:AAA
takk~$

関連記事はコチラ
grepの色を変える
(Linux)grepで発見行の前後も表示する

which コマンドのパス検索

which [-a] コマンド名 …

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

takk~$ which ls
/usr/bin/ls
takk~$

-aオプションを使用すると、実行ファイルがあるすべてのパスを表示します。

takk~$ which -a ls
/usr/bin/ls
/bin/ls
takk~$

複数のコマンドを指定することもできます。

takk~$ which ls file find
/usr/bin/ls
/usr/bin/file
/usr/bin/find
takk~$

whereis コマンドに関連したファイルの表示

whereisコマンドでバイナリ、ソース、manドキュメントのパスを表示します。

takk~$ whereis ssh
ssh: /usr/bin/ssh /etc/ssh /usr/share/man/man1/ssh.1.gz /usr/src/openssh-7.9p1/ssh.o /usr/src/openssh-7.9p1/ssh /usr/src/openssh-7.9p1/ssh.c /usr/src/openssh-7.9p1/ssh.0 /usr/src/openssh-7.9p1/ssh.1 /usr/src/openssh-7.9p1/ssh2.h /usr/src/openssh-7.9p1/ssh.h
takk~$

find 階層内のファイル検索

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point…] [ex‐pression]

ディレクトリ深く埋もれたファイルを探してくれるコマンドです。

takk~$ mkdir -p aa/bb/cc/dd/ee
takk~$ tmp=!$
tmp=aa/bb/cc/dd/ee
takk~$ touch $tmp/test{1..9}.txt
takk~$

find 引数なしの場合

findの引数に何も指定しないと、カレントディレクトリ以下のファイルを全て表示します。

takk~$ find
.
./.bash_logout
./.profile
./aa
./aa/bb
./aa/bb/cc
./aa/bb/cc/dd
./aa/bb/cc/dd/ee
./aa/bb/cc/dd/ee/test5.txt
./aa/bb/cc/dd/ee/test2.txt
./aa/bb/cc/dd/ee/test8.txt
./aa/bb/cc/dd/ee/test1.txt
./aa/bb/cc/dd/ee/test3.txt
./aa/bb/cc/dd/ee/test6.txt
./aa/bb/cc/dd/ee/test4.txt
./aa/bb/cc/dd/ee/test7.txt
./aa/bb/cc/dd/ee/test9.txt
./.bashrc
./.bash_history
takk~$

find ディレクトリ配下すべて

takk~$ find aa
aa
aa/bb
aa/bb/cc
aa/bb/cc/dd
aa/bb/cc/dd/ee
aa/bb/cc/dd/ee/test5.txt
aa/bb/cc/dd/ee/test2.txt
aa/bb/cc/dd/ee/test8.txt
aa/bb/cc/dd/ee/test1.txt
aa/bb/cc/dd/ee/test3.txt
aa/bb/cc/dd/ee/test6.txt
aa/bb/cc/dd/ee/test4.txt
aa/bb/cc/dd/ee/test7.txt
aa/bb/cc/dd/ee/test9.txt
takk~$

find -name ファイル名で検索

takk~$ find -name '*9*'
./aa/bb/cc/dd/ee/test9.txt
takk~$

7.比較・ソートコマンド

sort ソート

sort [オプション]… [ファイル]…

テキストの並べ替えをしてくれるコマンドです。
このような内容のファイルがあります。

takk~$ cat file.txt
DDD
BBB
CCC
EEE
AAA
takk~$

これにsortコマンドを実行してみましょう。

takk~$ sort file.txt
AAA
BBB
CCC
DDD
EEE
takk~$

アルファベットの昇順に並び替えられました。

降順にするには、-rオプションです。

takk~$ sort -r file.txt
EEE
DDD
CCC
BBB
AAA
takk~$

さきほどは小文字のrのオプションでしたが、大文字Rオプション、-Rを使うとshufと同じことができます。

takk~$ sort -R file.txt
AAA
EEE
CCC
BBB
DDD
takk~$

cmp BYTE毎ファイル比較

cmp [オプション]… ファイル1 [ファイル2]

ファイルを1BYTE単位で比較します。

takk~$ echo ABCDE > a.txt
takk~$ echo A_CD_ > b.txt
takk~$ cmp a.txt b.txt
a.txt b.txt differ: byte 2, line 1
takk~$

cmp -b 最初差分の内容表示

takk~$ cmp -b a.txt b.txt
a.txt b.txt differ: byte 2, line 1 is 102 B 137 _
takk~$

cmp -l 差分を全部表示

takk~$ cmp -l a.txt b.txt
2 102 137
5 105 137
takk~$

関連記事はコチラ
(Linux)cmpコマンド

diff ファイル比較

takk~$ cat a.txt
111
222
333
444
555
takk~$ cat b.txt
111

3
444
555
takk~$ diff a.txt b.txt
2,3c2,3
< 222
< 333
---
>
> 3
takk~$

関連記事はコチラ
diffコマンドの読み方(その1)

patch パッチ当て

patch作成はdiffコマンドで行います。

takk~$ diff -u a.txt b.txt > from_a_to_b.patch
takk~$ cat from_a_to_b.patch
--- a.txt	2020-05-23 16:32:55.099435852 +0900
+++ b.txt	2020-05-23 16:33:10.579681161 +0900
@@ -1,5 +1,5 @@
 111
-222
-333
+
+3
 444
 555
takk~$

a.txtにパッチを当てて、b.txtと同じテキストにします。

takk~$
takk~$ patch a.txt < from_a_to_b.patch
patching file a.txt
takk~$ cat a.txt
111

3
444
555
takk~$

関連記事はコチラ
ディレクトリへのpatch

8.その他のコマンド

seq 数列生成

seq [オプション]… FIRST
seq [オプション]… FIRST LAST
seq [オプション]… FIRST INCREMENT LAST

数列を生成してくれるコマンドです。使ってみましょう。
数字を一つだけ指定すると、1から指定した数まで1ずつ増加する数列を得ることができます。

takk~$ seq 5
1
2
3
4
5
takk~$

数字を二つ指定すると、一番目に指定した数字から、二番目の数字まで、1ずつ増加する数列になります。

takk~$ seq 3 6
3
4
5
6
takk~$

三つ指定すると以下の通りです。

takk~$ seq 10 -3 -7
10
7
4
1
-2
-5
takk~$

INCREMENTにマイナス値を与えると、マイナス方向の数列も作れます。q

takk~$ seq -5 -1 -10
-5
-6
-7
-8
-9
-10
takk~$

-s セパレータ

seqのデフォルトのセパレータは改行コードとなっていますが、-sオプションで指定した文字列にセパレータを置き換えることができます。

takk~$ seq -s, 10
1,2,3,4,5,6,7,8,9,10
takk~$

関連記事はコチラ
感謝の達人 簡単なのに難しいSUM

date 日時設定または表示

date [オプション]… [+FORMAT]

言わずと知れた日時表示コマンドです。dateっていえば日付だけな気もしますが、時刻もしてくれます。

takk~$ date
Tue 12 May 2020 09:06:54 PM JST
takk~$

cal カレンダー

引数なしで実行すると当月のカレンダーを表示します。

現在日付が反転表示されます。

西暦を指定すると年間カレンダーを表示します。

関連記事はコチラ
calコマンドで91days

more ファイル通読フィルタ

more [オプション] ファイル…

ファイルを準備してからmoreで開きます。

takk~$ seq 999 > test.txt
takk~$ more test.txt
takk~$

以下のようにファイルの内容が流れず、ページ送り待ちになります。

スペースバーを押すと、ページ送りされます。

less moreと逆のコマンド

less [オプション]… ファイル

moreを使ったときと同じくファイルを準備してからlessで開きます。

takk~$ seq 999 > test.txt
takk~$ less test.txt
takk~$

表示のされかたはmoreに似てますね。lessの場合は左下がMoreではなく、ファイル名になっています。

上下キーでファイル内を閲覧できます。

qキーで閲覧を終了できます。

expr 式の評価

takk~$ expr 2 + 3 \* 4 / 2
8
takk~$

dc 任意精度計算機

dc、Enterで計算開始、qで終了です。

takk~$ dc
1 2 3 4 5 ++++p
15
q
takk~$

dc 16進変換

takk~$ dc
100 16op
64

dc 8進変換

takk~$ dc
100 8op
144

dc 2進変換

takk~$ dc
100 2op
1100100

関連記事はコチラ
dc用にデータと計算マクロの抱き合わせ
任意精度の計算機 dcを使いこなせるようになりたい
dcスタックを逆順に
dcでseq 10する

nkf 文字コード変換

nkf [オプション] [ファイル…]

nkfの略はNetwork Kanji Filterで、ネットワーク漢字コード変換フィルタと訳すのが正解だと思いますが、コマンドが探しにくいのでタイトルを文字コード変換としています。

–guess 文字コード取得

takk~$ echo あいう > a.txt
takk~$ nkf --guess a.txt
UTF-8 (LF)
takk~$

大文字オプションは入力文字コード
小文字オプションは出力文字コード
となっています。
-J ISO-2022-JP (JIS code)
-S Shift_JIS
-E EUC-JP
-W UTF-8N

UTF8をShift_JISに変換する場合は、 入力指定に-W、出力指定に小文字の-sを使います。

takk~$ nkf -W -s < a.txt > b.txt
takk~$ od -tx1 -An a.txt
 e3 81 82 e3 81 84 e3 81 86 0a
takk~$ od -tx1 -An b.txt
 82 a0 82 a2 82 a4 0a
takk~$

関連記事はコチラ
文字列の文字コードを手軽に確認
(Linux)ディレクトリ構成のみコピー、複数ファイルを文字コード変換(nkf)

dd バイナリファイル操作

dd [オペランド]…
dd [オプション]

オプション一覧
bs=BYTES
cbs=BYTES
conv=CONVS
count=N
ibs=BYTES
if=入力ファイル
iflag=iflag
of=出力ファイル
oflag=FLAGS
seek=N
skip=N
status=LEVEL

使い方はこちらにまとめてあります。
ddコマンドまとめ

関連記事はコチラ
ddランダム
ddコピーにキーボード入力

hexdump,hd 16進ファイルダンプ

hexdump [オプション]… ファイル…
hd [オプション]… ファイル…

16進数でファイルダンプします。

takk~$ echo ABCDE > a.bin
takk~$ hexdump a.bin
0000000 4241 4443 0a45
0000006
takk~$

hdコマンドは、hexdumpのシンボリックリンクとなっています。

takk~$ ls -l `which hd`
lrwxrwxrwx 1 root root 7 May  4  2018 /usr/bin/hd -> hexdump
takk~$

od ファイルダンプ

od [オプション]… ファイル…

8進数でファイルダンプします。

takk~$ echo ABCDE > a.bin
takk~$ od a.bin
0000000 041101 042103 005105
0000006
takk~$

関連記事はコチラ
binutilsにodはない

xxd バイナリ16進相互変換

xxd [オプション] [入力ファイル [出力ファイル]]
xxd -r [オプション] [入力ファイル [出力ファイル]]

バイナリファイルを16進ダンプ、または16進で記述されたテキストをバイナリに変換します。

takk~$ echo -ne "\x01\x81\x82" > a.bin
takk~$ xxd a.bin
00000000: 0181 82                                  ...
takk~$

関連記事はコチラ
xxdで魔法のようにバイナリを生成する

truncate ファイルの切り詰め、拡張

-s 拡張の場合

takk~$ echo HELLO > a.bin
takk~$ ls -l a.bin
-rw-r--r-- 1 takk takk 6 May 31 08:38 a.bin
takk~$ truncate -s10 a.bin
takk~$ ls -l a.bin
-rw-r--r-- 1 takk takk 10 May 31 08:38 a.bin
takk~$ hd a.bin
00000000  48 45 4c 4c 4f 0a 00 00  00 00                    |HELLO.....|
0000000a
takk~$

-s 切り詰めの場合

takk~$ hd a.bin
00000000  48 45 4c 4c 4f 0a 00 00  00 00                    |HELLO.....|
0000000a
takk~$ truncate -s4 a.bin
takk~$ ls -l a.bin
-rw-r--r-- 1 takk takk 4 May 31 08:40 a.bin
takk~$ hd a.bin
00000000  48 45 4c 4c                                       |HELL|
00000004
takk~$

関連記事はコチラ
イメージファイルを直接編集してファイルの内容を変更
truncateコマンド

9.ファイル・アーカイブ

cpio アーカイブへのコピーまたはその逆

chmod [オプション]… [ディレクトリ]

ファイルを書庫へコピーしたり、書庫からファイルへコピーするコマンドです。

man cpioより

cpio -o < NAME-LIST [> ARCHIVE]
# 書庫 ARCHIVE からファイルを抽出する
cpio -i [< archive]
# NAME-LIST にあるファイル名のファイルをディレクトリ DIR
にコピーする
cpio -p DIR < NAME-LIST

主操作モード:
-i, --extract              書庫からファイルを抽出する (copy-in
                           モードで実行)
-o, --create               書庫を作成する (copy-out
                           モードで実行)

関連記事はコチラ
cpioでアーカイブの内容を確認する
cpioでエンディアン変換
cpioで複数ファイルのエンディアン変換
cpioで単純なディレクトリコピー
cpioヘッダ(その1)

chmod ファイルモード変更

chmod [オプション]… モード… ファイル…

ファイルのモードを変更します。

takk~$ echo HELLO > aaa.txt
takk~$ ls -l
total 4
-rw-r--r-- 1 takk takk 6 May 12 23:05 aaa.txt
takk~$

ls -lでファイルパーミッションを確認すると、644になっています。
ユーザーは6、Read/Write可
グループは4、Read可
その他は4、Read可
です。

chmodでパーミッションを変更してみましょう。
ユーザをRead/Write可から、Read可にしてみます。

takk~$ chmod 444 aaa.txt
takk~$ ls -l
total 4
-r--r--r-- 1 takk takk 6 May 12 23:05 aaa.txt
takk~$

変更されました。
この状態でこのファイルをrmしようとすると、

takk~$ rm aaa.txt
rm: remove write-protected regular file 'aaa.txt'?
takk~$ ls -l
total 4
-r--r--r-- 1 takk takk 6 May 12 23:05 aaa.txt
takk~$

削除できませんでした。

ファイルのパーミッションを元に戻します。

takk~$ ls -l
total 4
-r--r--r-- 1 takk takk 6 May 12 23:05 aaa.txt
takk~$
takk~$ chmod 644 aaa.txt
takk~$ ls -l
total 4
-rw-r--r-- 1 takk takk 6 May 12 23:05 aaa.txt
takk~$ rm aaa.txt
takk~$ ls -l
total 0
takk~$

ファイル削除できました。

関連記事はコチラ
lsのファイルパーミッションを8進表記にする
chmodが呼び出しているシステムコール

tar 書庫ユーティリティ

tar オプション[f 書庫ファイル] [オプション] [ファイル…]

慣れたらものすごく使いやすいのですが、結構苦手に人が多いtarコマンド。
tarコマンドは圧縮、解凍してくれるイメージが強いと思いますが、基本的にはファイルをまとめて書庫にしたり、書庫をファイルに展開したりするコマンドです。

tar c ファイルをまとめる

まずはファイルを準備します。

takk~$ ls
takk~$ echo AAA > file1.txt
takk~$ echo BBB > file2.txt
takk~$ echo CCC > file3.txt
takk~$ ls -l
total 12
-rw-r--r-- 1 takk takk 4 May 12 20:51 file1.txt
-rw-r--r-- 1 takk takk 4 May 12 20:51 file2.txt
-rw-r--r-- 1 takk takk 4 May 12 20:51 file3.txt
takk~$

この3つのファイルをまとめて、tarファイルにしてみます。

takk~$ tar cf test.tar file*.txt
takk~$ ls -l
total 24
-rw-r--r-- 1 takk takk     4 May 12 20:51 file1.txt
-rw-r--r-- 1 takk takk     4 May 12 20:51 file2.txt
-rw-r--r-- 1 takk takk     4 May 12 20:51 file3.txt
-rw-r--r-- 1 takk takk 10240 May 12 20:53 test.tar
takk~$

test.tarというファイルができました。

tar t 書庫内を一覧

ファイルコマンドで、ファイルの種類を確認してみます。

takk~$ file test.tar
test.tar: POSIX tar archive (GNU)
takk~$

tarの書庫ファイルですね。
書庫の内容を一覧表示してみます。

takk~$ tar tf test.tar
file1.txt
file2.txt
file3.txt
takk~$

関連記事はコチラ
大量ファイルはtar cでなくtar rオプションを使う
特定ファイル以外をtarボールにする

dos2unix 改行コード変換

dos2unix [オプション] [ファイル…]

テキストファイルのWindowsの改行コード(CRLF)を、Unix/Mac/Linuxの改行コードに変換します。

unix2dox [オプション] [ファイル…]
dos2unixの逆です。

関連記事はコチラ
dos2unixで改行コードの変換

size セクションサイズ一覧

takk~$ cat t.c
#include<stdio.h>

int main()
{
	printf("HELLO\n");
}
takk~$ gcc t.c;ls
a.out  t.c
takk~$ size a.out
   text	   data	    bss	    dec	    hex	filename
   1451	    584	      8	   2043	    7fb	a.out
takk~$

関連記事はコチラ
sizeコマンド
sizeコマンドの仲間たち
sizeコマンドで苦手なセクションを覚える
sizeコマンドでdata,bssを確認する

10.システム管理コマンド

uname システム情報表示

uname [オプション]…

uname 引数なしの場合

takk~$ uname
Linux
takk~$

uname -r カーネルバージョン表示

takk~$ uname -r
4.19.0-8-amd64
takk~$

uname -m ハードウェアアーキテクチャ表示

takk~$ uname -m
x86_64
takk~$

uname -a 全オプション指定

takk~$ uname -a
Linux xxx-xxx-xx-xxx 4.19.0-8-amd64 #1 SMP Debian 4.19.98-1 (2020-01-26) x86_64 GNU/Linux
takk~$

whoami 実効ユーザ名

takk~$ whoami
takk
takk~$

関連記事はコチラ
私は誰?(whoami)

ps プロセス一覧

takk~$ ps
  PID TTY          TIME CMD
21548 pts/0    00:00:00 sh
21553 pts/0    00:00:00 bash
21579 pts/0    00:00:00 ps
takk~$

ヘルプです。

takk~$ ps --help

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).
takk~$

関連記事はこちら
psコマンドのオプションをソースで確認
psコマンドのオプション、その解析方法

kill プロセス終了

シグナル番号を指定してプロセスを止める

takk~$ top &
[1] 17711
takk~$ kill -9 17711

[1]+  停止                  top
takk~$ ps | grep 17711
[1]+  強制終了            top
takk~$ ps | grep 17711
takk~$

-l シグナル名一覧

takk~$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
takk~$

関連記事はコチラ
killコマンドでやってること

killall プロセス名を指定して終了

takk~$ top &
[1] 18173
takk~$ killall -9 top
[1]+  強制終了            top
takk~$

top プロセス表示

top -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols]

takk~$ top
top - 13:43:23 up 59 days, 15:09,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  67 total,   1 running,  66 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :    481.7 total,     32.5 free,     58.0 used,    391.2 buff/cache
MiB Swap:   2048.0 total,   2030.3 free,     17.7 used.    406.4 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 6603 takk      20   0   16900   4920   3804 S   0.3   1.0   0:00.20 sshd
    1 root      20   0  170548   8388   6580 S   0.0   1.7   2:36.63 systemd
    2 root      20   0       0      0      0 S   0.0   0.0   0:00.52 kthreadd
    3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
    4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
    6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0+
    8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu+
    9 root      20   0       0      0      0 S   0.0   0.0   0:59.34 ksoftirqd+
   10 root      20   0       0      0      0 I   0.0   0.0  22:51.51 rcu_sched
   11 root      20   0       0      0      0 I   0.0   0.0   0:00.00 rcu_bh
   12 root      rt   0       0      0      0 S   0.0   0.0   0:13.23 migration+
   14 root      20   0       0      0      0 S   0.0   0.0   0:00.01 cpuhp/0
   15 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs

〜以下省略〜

vmstat 仮想メモリ統計

vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk partition]
vmstat [-V]

takk~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0  18076  33976 153948 246740    0    0     0     3    2    7  0  0 100  0  0
takk~$

strip シンボル削除

takk~$ cat t.c
#include<stdio.h>

int main()
{
	printf("HELLO\n");
}
takk~$ gcc t.c
takk~$ ls -l
total 24
-rwxr-xr-x 1 takk takk 16600 May 29 19:24 a.out
-rw-r--r-- 1 takk takk    54 May 29 19:23 t.c
takk~$ cp a.out b.out
takk~$ strip b.out
takk~$ ls -l
total 40
-rwxr-xr-x 1 takk takk 16600 May 29 19:24 a.out
-rwxr-xr-x 1 takk takk 14408 May 29 19:24 b.out
-rw-r--r-- 1 takk takk    54 May 29 19:23 t.c
takk~$

関連記事はコチラ
stripコマンド

df ディスク使用量

各デバイス別のディスク使用量を表示してくれるコマンドです。

takk~$ df
ファイルシス   1K-ブロック     使用  使用可 使用% マウント位置
udev                231428        0  231428    0% /dev
tmpfs                49332     5416   43916   11% /run
/dev/vda2         30829544 20688016 8657480   71% /
tmpfs               246648        0  246648    0% /dev/shm
tmpfs                 5120        0    5120    0% /run/lock
tmpfs               246648        0  246648    0% /sys/fs/cgroup
tmpfs                49328        0   49328    0% /run/user/1000
takk~$

-hを指定すると単位がついてわかりやすくなります。

takk~$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
udev             227M     0  227M    0% /dev
tmpfs             49M  5.3M   43M   11% /run
/dev/vda2         30G   20G  8.3G   71% /
tmpfs            241M     0  241M    0% /dev/shm
tmpfs            5.0M     0  5.0M    0% /run/lock
tmpfs            241M     0  241M    0% /sys/fs/cgroup
tmpfs             49M     0   49M    0% /run/user/1000
takk~$

du ディスク使用量推定

du [オプション]… [ファイル]…

ファイルなしの場合

引数なしでduを実行すると、カレントディレクトリ自身の推定使用サイズのみ表示します。
単位はKByteです。

takk~/tmp$ find
.
takk~/tmp$ du
4	.
takk~/tmp$

空ディレクトリの場合

ディレクトリは空でもサイズが4KByteで計上されます。

takk~/tmp$ mkdir dir1 dir2
takk~/tmp$ find
.
./dir2
./dir1
takk~/tmp$ du
4	./dir2
4	./dir1
12	.
takk~/tmp$

空ファイルの場合

一方空ファイルの場合は、計上されません。

takk~/tmp$ touch dir1/file1.txt
takk~/tmp$ find
.
./dir2
./dir1
./dir1/file1.txt
takk~/tmp$ du
4	./dir2
4	./dir1
12	.
takk~/tmp$

-h 単位を表示

takk~/tmp$ echo HELLO > dir1/file1.txt
takk~/tmp$ mkdir -p dir2/dir3
takk~/tmp$ find
.
./dir2
./dir2/dir3
./dir1
./dir1/file1.txt
takk~/tmp$ du -h
4.0K	./dir2/dir3
8.0K	./dir2
8.0K	./dir1
20K	.
takk~/tmp$

-d 単位を表示

-dオプション(–depth)で、表示する階層レベルを指定できます。
0の場合は、カレントディレクトリの推定合計サイズのみ表示します。

takk~/tmp$ du -d0
20	.
takk~/tmp$ du -d1
8	./dir2
8	./dir1
20	.
takk~/tmp$ du -d2
4	./dir2/dir3
8	./dir2
8	./dir1
20	.
takk~/tmp$

関連記事はコチラ
ディスク使用量の内訳を調べる(du)

mount マウント

(基本的な使い方)
mount -t type device dir

ファイルシステムを/(ルート)ツリーにマウントします。

関連記事
mountコマンドに慣れる

useradd ユーザ追加

useradd [オプション]… ユーザ名

~# useradd testuser1
~# grep testuser1 /etc/passwd
testuser1:x:1001:1001::/home/testuser1:/bin/sh
~#

-m ホームディレクトリを作成する

ユーザ追加に合わせてホームディレクトリも作成します。

~# useradd -m testuser1
~# grep testuser1 /etc/passwd
testuser1:x:1001:1001::/home/testuser1:/bin/sh
~# ls /home | grep testuser1
testuser1
~#

usermod ユーザアカウント変更

usermod [オプション]… ユーザ名

-l ユーザIDの変更

引数で指定したユーザIDを、
-lで指定したユーザIDに変更します。
ホームディレクトリはそのままです。

~# grep olduser /etc/passwd
olduser:x:1001:1001::/home/olduser:/bin/sh
~# usermod -l newuser olduser
~# grep olduser /etc/passwd
newuser:x:1001:1001::/home/olduser:/bin/sh
~# grep newuser /etc/passwd
newuser:x:1001:1001::/home/olduser:/bin/sh
~#

-G 補助グループの指定

takk~$ sudo usermod -G sudo takk2
takk~$

userdel ユーザ削除

userdel [オプション]… ユーザ名

~# grep testuser1 /etc/passwd
testuser1:x:1001:1001::/home/testuser1:/bin/sh
~# userdel testuser1
~# grep testuser1 /etc/passwd
~#

-r ホームディレクトリ削除

ユーザを削除し、ホームディレクトリも削除します。
ホームディレクトリはユーザIDと同一の名前でないと削除されません。

~# ls /home | grep testuser1
testuser1
~# userdel -r testuser1
~# ls /home | grep testuser1
~#

id uid/gid表示

id [オプション]… [ユーザ]

ユーザIDとユーザが所属するグループを表示します。

takk~$ id
uid=1000(takk) gid=1000(takk) groups=1000(takk),27(sudo)
takk~$

groupadd グループ追加

groupadd [オプション]… ユーザ名

~# groupadd test1
~# grep test1 /etc/group
test1:x:1002:
~#

groupmod グループ変更

groupmod [オプション]… ユーザ名

-nオプションで新しいグループ名を指定できます。

test1グループを、test2という名前に変更する場合。

~# groupmod -n test2 test1
~# grep test /etc/group
test2:x:1002:
~#

groupdel グループ削除

groupdel ユーザ名

~# groupdel test2
~# grep test /etc/group
~#

ping ICMP ECHOリクエスト

ping [オプション]… ホスト

ICMPエコー要求を送って、レスポンスを確認するコマンドです。

takk~$ ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.033 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.036 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.031 ms
^C
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 82ms
rtt min/avg/max/mdev = 0.015/0.028/0.036/0.010 ms
takk~$

-c パケット数を指定

takk~$ ping -c 2 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.032 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 31ms
rtt min/avg/max/mdev = 0.016/0.024/0.032/0.008 ms
takk~$

traceroute ホストまでのルートパケットトレース

traceroute [オプション]… ホスト

takk~$ traceroute yahoo.co.jp
traceroute to yahoo.co.jp (183.79.135.206), 30 hops max, 60 byte packets
 1  v133-130-90-3.a01f.g.tyo1.static.cnode.io (133.130.90.3)  1.007 ms  1.032 ms  1.176 ms
 2  g-o-4eb-a13-4-v-712.interq.or.jp (157.7.41.129)  3.864 ms  3.992 ms  4.097 ms
 3  unused-133-130-013-013.interq.or.jp (133.130.13.13)  0.906 ms  0.902 ms  0.898 ms
 4  unused-133-130-012-034.interq.or.jp (133.130.12.34)  0.885 ms  0.879 ms  1.079 ms
 5  218.100.6.16 (218.100.6.16)  1.753 ms  1.746 ms  1.775 ms
 6  * * *
 7  101.102.204.246 (101.102.204.246)  7.650 ms  7.642 ms  7.634 ms
 8  124.83.228.54 (124.83.228.54)  7.431 ms  7.734 ms  7.702 ms
 9  124.83.252.170 (124.83.252.170)  14.081 ms  14.080 ms  14.067 ms
10  114.111.64.202 (114.111.64.202)  13.572 ms  13.588 ms  13.559 ms
11  * * *
〜省略〜
30  * * *
takk~$

ip ネットワーク関連コマンド

ip [オプション]… オブジェクト [コマンド]

takk~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:01:85:82:5a:96 brd ff:ff:ff:ff:ff:ff
    inet 133.130.90.150/23 brd 133.130.91.255 scope global dynamic eth0
       valid_lft 83979sec preferred_lft 83979sec
    inet6 2400:8500:1301:740:133:130:90:150/128 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::1:85ff:fe82:5a96/64 scope link
       valid_lft forever preferred_lft forever
takk~$

rsync リモートファイルコピー

rsync [オプション] SRC… [DEST]

ローカルでもリモートでも使えるコピーコマンドです。

ローカルファイルコピー

takk~$ ls -l
total 4
-rw-r--r-- 1 takk takk 6 Jun  2 23:24 file1.txt
takk~$ rsync file1.txt file2.txt
takk~$ cmp *.txt
takk~$

リモートファイルコピー

takk~$ rsync file1.txt takk@コピー先アドレス:/home/takk/
takk~$

11. マニュアル

man

man [オプション] コマンド名

基本はコマンド名だけ指定すればマニュアルが読めます。

takk~$ man ls

関連記事はコチラ
マニュアル(man)のセクション番号

コメント

タイトルとURLをコピーしました