注:私はこれを改訂することを計画しており、これをより包括的なガイドに拡張するのに役立つ新しい共著者を探しています。それは非常に人気がありますが、それはより広く、もう少し深くなる可能性があります。あなたが書くのが好きで、この資料の専門家であり、助けることをいとわないなら、私にメモを送ってください josh (0x40) holloway.com.–ジェレビー、ホロウェイ。ありがとうございました!
コマンドラインでの流暢さは、しばしば無視されたり、難解と見なされるスキルですが、エンジニアとしての柔軟性と生産性を明白な方法と微妙な方法の両方で向上させます。これは、Linuxで作業するときに役立つコマンドラインの使用に関するメモとヒントの選択です。いくつかのヒントは初歩的なものであり、いくつかはかなり具体的、洗練されている、またはあいまいです。このページは長くはありませんが、ここにあるすべてのアイテムを使用して思い出すことができれば、多くのことがわかります。
この作品は多くの著者と翻訳者の結果です。 これのいくつかはもともとQuoraに登場しました、 しかし、その後GitHubに移行し、元の作成者よりも才能のある人々が多くの改善を行いました。コマンドラインに関する質問がある場合は、質問を送信してください。エラーやもっと良いものを見つけたら貢献してください!
スコープ:
筆記:
apt
yum
dnf
pacman
pip
brew
基本的なバッシュを学びます。実際には、全体を入力して、少なくともスキミングします。フォローするのはとても簡単で、それほど長くはありません。代替シェルは素晴らしいかもしれませんが、Bashは強力で常に利用可能です(自分のラップトップで誘惑しながら、zsh、fishなどのみを学習すると、既存のサーバーを使用するなど、多くの状況で制限されます)。
man bash
少なくとも1つのテキストベースのエディタをよく学びましょう。エディターは、基本的な編集(開く、編集する、保存する、検索する)に最も簡単なエディターの1つです。ただし、テキスト端末のパワーユーザーにとって、習得は難しいが由緒ある、高速でフル機能のエディターであるVim()に代わるものはありません。多くの人々は、特に大規模な編集タスクのために、古典的なEmacsも使用しています。(もちろん、大規模なプロジェクトに取り組んでいる現代のソフトウェア開発者は、純粋なテキストベースのエディタのみを使用する可能性は低く、最新のグラフィカルIDEとツールにも精通している必要があります。
nano
vi
ドキュメントの検索:
man
man man
apropos
help
help -d
type command
curl cheat.sh/commandシェルコマンドの使用方法の一般的な例を含む簡単な「チートシート」を提供します。
を使用して出力と入力をリダイレクトする方法について説明します。Know は出力ファイルを上書きして追加します。標準出力と標準エラーについて学習します。
>
<
|
>
>>
(そしておそらくと...)と引用によるファイルグロブ拡張と、二重引用符と一重引用符の違いについて学びます。(変数展開の詳細については、以下を参照してください。
*
?
[
]
"
'
Bashジョブ管理に精通している:、ctrl-z、ctrl-c、、など。
&
jobs
fg
bg
kill
、およびパスワードレス認証の基本、経由、などを知っています。
ssh
ssh-agent
ssh-add
基本的なファイル管理:および(特に、すべての列の意味を学ぶ)、、、および(またはさらに良いことに)、および(ハードリンクとソフトリンクの違いと利点を学ぶ)、、、(ディスク使用量の簡単な要約:)。ファイル・システム管理の場合、、。iノードとは何かを学びます(または)。
ls
ls -l
ls -l
less
head
tail
tail -f
less +F
ln
ln -s
chown
chmod
du
du -hs *
df
mount
fdisk
mkfs
lsblk
ls -i
df -i
基本的なネットワーク管理: または、、、、。
ip
ifconfig
dig
traceroute
route
などのバージョン管理システムを学習して使用する。
git
正規表現をよく知っていて、/にさまざまなフラグがあります。、およびオプションは知っておく価値があります。
grep
egrep
-i
-o
-v
-A
-B
-C
、、または(ディストリビューションに応じて)を使用してパッケージを見つけてインストールする方法について説明します。また、Pythonベースのコマンドラインツールをインストールする必要があることを確認してください(以下のいくつかは、を介してインストールするのが最も簡単です)。
apt-get
yum
dnf
pacman
pip
pip
Bashでは、Tabを使用して引数を入力するか、使用可能なすべてのコマンドを一覧表示し、ctrl-rを使用してコマンド履歴を検索します(押した後、入力して検索し、ctrl-rを繰り返し押してさらに一致するものを循環させるか、Enterキーを押して見つかったコマンドを実行するか、右矢印を押して結果を現在の行に配置して編集を許可します)。
Bash では、ctrl-w を使用して最後の単語を削除し、ctrl-u を使用して現在のカーソルから行の先頭に戻るコンテンツを削除します。単語で移動するには alt-b と alt-f を、カーソルを行の先頭に移動するには ctrl-a を、行末に移動するには ctrl-e を、行末まで強制終了するには ctrl-k を、画面をクリアするには ctrl-l を使用します。 Bashのすべてのデフォルトのキーバインドについては、を参照してください。たくさんあります。たとえば、alt-. は前の引数を循環し、alt-* は glob を展開します。
man readline
あるいは、viスタイルのキーバインディングが好きなら、それを使用してください(そしてそれを元に戻します)。
set -o vi
set -o emacs
長いコマンドを編集する場合、エディターを設定した後(たとえば)、ctrl-x ctrl-eは、複数行の編集のためにエディターで現在のコマンドを開きます。またはviスタイルでは、エスケープ-v。
export EDITOR=vim
最近のコマンドを表示するには、 を使用します。(コマンド番号)に従って、再度実行します。使用できる略語もたくさんありますが、おそらく最後の引数と最後のコマンドに最も役立つでしょう(マニュアルページの「履歴の展開」を参照)。ただし、これらは多くの場合、ctrl-rおよびalt-に簡単に置き換えられます。
history
!n
n
!$
!!
でホームディレクトリに移動します。ホームディレクトリに関連するプレフィックス(例:)の付いたファイルにアクセスします。スクリプトでは、ホームディレクトリを として参照します。
cd
~
~/.bashrc
sh
$HOME
前の作業ディレクトリに戻るには: .
cd -
コマンドの入力の途中で気が変わった場合は、alt-#を押して最初にaを追加し、コメントとして入力します(またはctrl-a、#、Enterを使用します)。 その後、コマンド履歴を使用して戻ることができます。
#
(または)を使用します。それは非常に強力です。1 行ごとに実行する項目の数 () と並列処理 () を制御できます。それが正しいことをするかどうかわからない場合は、最初に使用してください。また、便利です。例:
xargs
parallel
-L
-P
xargs echo
-I{}
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
pstree -pは、プロセスツリーの便利な表示です。
とを使用して、名前でプロセスを検索または通知します(便利です)。
pgrep
pkill
-f
プロセスを送信できるさまざまなシグナルを把握します。たとえば、プロセスを中断するには、 を使用します。完全なリストについては、
kill -STOP [pid]
man 7 signal
バックグラウンドプロセスを永久に実行し続ける場合は、またはを使用します。
nohup
disown
どのプロセスが or (TCP の場合は UDP の場合は追加) または (macOS でも動作) を介してリッスンしているかを確認します。
netstat -lntp
ss -plat
-u
lsof -iTCP -sTCP:LISTEN -P -n
開いているソケットとファイルについては、および「」も参照してください。
lsof
fuser
システムの実行時間を確認するかを確認します。
uptime
w
よく使用するコマンドのショートカットを作成するために使用します。たとえば、新しいエイリアスを作成します。
alias
alias ll='ls -latr'
ll
でよく使用するエイリアス、シェル設定、関数を保存し、ログインシェルがソースになるように手配します。これにより、すべてのシェルセッションでセットアップを使用できるようになります。
~/.bashrc
環境変数の設定と、ログイン時に実行するコマンドを入れます。グラフィカル環境のログインとジョブから起動するシェルには、個別の設定が必要になります。
~/.bash_profile
cron
設定ファイルを同期します(例: と)Gitを搭載したさまざまなコンピューター間で。
.bashrc
.bash_profile
変数とファイル名に空白が含まれている場合は注意が必要です。Bash変数を引用符で囲みます。ファイル名を区切るためにヌル文字を有効にするためのorオプションを優先します。 又は。for ループ内の空白を含むファイル名を反復処理するには、 を使用して IFS を改行に設定します。
"$FOO"
-0
-print0
locate -0 pattern | xargs -0 ls -al
find / -print0 -type d | xargs -0 ls -al
IFS=$'\n'
Bash スクリプトでは、出力のデバッグに (または、展開されていない変数やコメントを含む生の入力をログに記録するバリアント) を使用します。次のことを行わない正当な理由がない限り、厳密モードを使用します。 エラー(ゼロ以外の終了コード)で中止するために使用します。未設定の変数の使用状況を検出するために使用します。パイプ内のエラーで中止することも検討してください(ただし、このトピックは少し微妙であるため、そうする場合はもっと読んでください)。より複雑なスクリプトの場合は、EXIT または ERR でも使用します。便利な習慣は、次のようなスクリプトを開始すると、一般的なエラーを検出して中止し、メッセージを出力することです。
set -x
set -v
set -e
set -u
set -o pipefail
trap
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
Bashでは、変数展開には多くの種類があることに注意してください。変数が存在することを確認しています: .たとえば、Bash スクリプトで 1 つの引数が必要な場合は、 と記述するだけです。変数が空の場合にデフォルト値を使用する: .前の例に追加の(オプションの)パラメータを追加する場合は、 のようなものを使用できます。が省略されて空の場合、 に設定されます。算術展開: .シーケンス:。文字列のトリミング: と .たとえば、 の場合、 は を出力します。
${name:?error message}
input_file=${1:?usage: $0 input_file}
${name:-default}
output_file=${2:-logfile}
$2
output_file
logfile
i=$(( (i + 1) % 5 ))
{1..10}
${var%suffix}
${var#prefix}
var=foo.pdf
echo ${var%.pdf}.txt
foo.txt
を使用してブレース拡張...類似したテキストを再入力する必要を減らし、項目の組み合わせを自動化できます。これは、(両方のファイルを移動する)、(に展開する)、または(可能なすべての組み合わせを展開してディレクトリツリーを作成する)などの例で役立ちます。中括弧の拡張は、他の拡張の前に実行されます。
{
}
mv foo.{txt,pdf} some-dir
cp somefile{,.bak}
cp somefile somefile.bak
mkdir -p test-{a,b,c}/subtest-{1,2,3}
展開の順序は次のとおりです。チルダ展開、パラメータと変数の展開、算術展開、およびコマンド置換(左から右への方法で行われます)。単語分割とファイル名の展開。(たとえば、 のような範囲は、 を使用して変数で表現することはできません。代わりに または ループを使用します (例: または)。
{1..20}
{$a..$b}
seq
for
seq $a $b
for((i=a; i<=b; i++)); do ... ; done
コマンドの出力は、via のファイルのように扱うことができます (プロセス置換と呼ばれます)。たとえば、ローカルとリモートを比較します。
<(some command)
/etc/hosts
diff /etc/hosts <(ssh somehost cat /etc/hosts)
{
# Your code here
}
cat <<EOF input on multiple lines EOF
Bashでは、標準出力と標準エラーの両方を次のようにリダイレクトします。多くの場合、コマンドが開いているファイルハンドルを標準入力に残さないようにし、現在の端末に結び付けるために、 を追加するのも良い習慣です。
some-command >logfile 2>&1
some-command &>logfile
</dev/null
16進数と10進数の値を持つ優れたASCIIテーブルに使用します。一般的なエンコード情報については、、、およびが役立ちます。
man ascii
man unicode
man utf-8
man latin1
または tmux
を使用して画面を多重化し、特にリモート ssh セッションで、セッションをデタッチして再アタッチする場合に便利です。 より多くの情報とより簡単な管理を提供することにより、画面またはTMUXを強化できます。セッション永続性のみのより最小限の代替手段はdtach
です。
screen
byobu
sshでは、リモートサーバーからWebサイトにアクセスするなど、または(そして時には)でトンネルを移植する方法を知っていると便利です。
-L
-D
-R
ssh構成にいくつかの最適化を行うと便利な場合があります。たとえば、これには、特定のネットワーク環境での接続の切断を回避するための設定、圧縮の使用(低帯域幅接続でのSCPで役立ちます)、ローカル制御ファイルを使用して同じサーバーへのチャネルを多重化するための設定が含まれます。
~/.ssh/config
TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 Compression=yes ControlMaster auto ControlPath /tmp/%r@%h:%p ControlPersist yes
sshに関連する他のいくつかのオプションはセキュリティに敏感であり、サブネットやホストごと、または信頼できるネットワークなどで注意して有効にする必要があります。
StrictHostKeyChecking=no
ForwardAgent=yes
UDPを使用するsshの代替としてmosh
を検討し、接続の切断を回避し、外出先での利便性を高めます(サーバー側のセットアップが必要です)。
8進数形式のファイルに対するアクセス許可を取得するには、システム構成には便利ですが、 では利用できず、バングルするのは簡単ですが、次のようなものを使用します。
ls
stat -c '%A %a %n' /etc/timezone
別のコマンド( など)の出力に基づいてファイルを操作するには、(PathPicker)を使用します。
git
fpp
ネットワーク上のすべての人が利用できる、現在のディレクトリ(およびサブディレクトリ)内のすべてのファイル用の単純なWebサーバーの場合は、(ポート7777およびPython 2の場合)および(ポート7777およびPython 3の場合)を使用します。
python -m SimpleHTTPServer 7777
python -m http.server 7777
別のユーザーとしてコマンドを実行するには、 を使用します。デフォルトでは root として実行されます。別のユーザーを指定するために使用します。そのユーザーとしてログインするために使用します(パスワードの入力を求められます)。
sudo
-u
-i
シェルを別のユーザーに切り替えるには、またはを使用します。「-」が付いた後者は、別のユーザーがログインしたばかりのかのように環境を取得します。ユーザー名を省略すると、デフォルトで root になります。切り替え先のユーザーのパスワードの入力を求められます。
su username
su - username
コマンドラインの128Kの制限について知っています。この「引数リストが長すぎます」というエラーは、ワイルドカードが多数のファイルに一致する場合によく発生します。(これが起こるとき、のような代替案が役立つかもしれません。
find
xargs
基本的な計算機(そしてもちろん一般的なPythonへのアクセス)には、インタプリタを使用してください。例えば
python
>>> 2+3 5
現在のディレクトリ内の名前でファイルを検索する (または同様のもの)。任意の場所のファイルを名前で検索するには、 を使用します(ただし、最近作成されたファイルのインデックスが作成されていない可能性があることに注意してください)。
find . -iname '*something*'
locate something
updatedb
ソースファイルまたはデータファイルの一般的な検索には、(古いものから新しいものの順に)ack
、ag
(「シルバーサーチャー」)、rg
(ripgrep)など、よりも高度または高速なオプションがいくつかあります。
grep -r
HTML をテキストに変換するには:
lynx -dump -stdin
マークダウン、HTML、およびあらゆる種類のドキュメント変換については、pandoc
を試してください。たとえば、マークダウン文書を Word 形式に変換するには、次のようにします。
pandoc README.md --from markdown --to docx -o temp.docx
XMLを処理する必要がある場合は、古いですが良いです。
xmlstarlet
YAML の場合は、シャムル
を使用します。
Excel または CSV ファイルの場合、csvkit は 、、、などを提供します。
in2csv
csvcut
csvjoin
csvgrep
Amazon S3 の場合、s3cmd は便利で、s4cmd
の方が高速です。アマゾンのAWSと改良された
のこぎり
は、他のAWS
関連のタスクに不可欠です。
uniqとオプションを含むと知っている - 以下のワンライナーを参照してください。も参照してください。
sort
uniq
-u
-d
comm
、、およびテキストファイルの操作について理解しています。多くの人が使用しますが、忘れています。
cut
paste
join
cut
join
改行()、文字()、単語()、バイト()を数えることについて知っています。
wc
-l
-m
-w
-c
のように、stdinからファイルおよびstdoutにコピーすることについて知っています。
tee
ls -al | tee file.txt
グループ化、フィールドの反転、統計計算など、より複雑な計算の場合は、データマッシュ
を検討してください。
ロケールは、並べ替え順序 (照合順序) やパフォーマンスなど、多くのコマンド ライン ツールに微妙な影響を与えることを知っておいてください。ほとんどのLinuxインストールでは、その他のロケール変数を米国英語などのローカル設定に設定します。ただし、ロケールを変更すると並べ替えが変更されることに注意してください。また、i18nルーチンはソートやその他のコマンドの実行を何倍も遅くする可能性があることを知っておいてください。状況によっては (以下の設定操作や一意性操作など)、低速の i18n ルーチンを完全に無視して、従来のバイトベースのソート順を使用できます。
LANG
export LC_ALL=C
特定のコマンドの環境を設定するには、 のように、その呼び出しの前に環境変数の設定を付けます。
TZ=Pacific/Fiji date
基本的な知識と簡単なデータマンジング。例については、ワンライナーを参照してください。
awk
sed
1 つ以上のファイル内のすべての文字列を置換するには、次のようにします。
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
repren
を試してください。(場合によっては、このコマンドで複数の名前変更も可能ですが、その機能はすべてのLinuxディストリビューションで同じではないため、注意してください。rename
# Full rename of filenames, directories, and contents foo -> bar:
repren --full --preserve-case --from foo --to bar .
# Recover backup files whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# Same as above, using rename, if available:
rename 's/\.bak$//' *.bak
rsync
rsync
scp
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
ファイル処理時の進行状況を監視するには、pv
、pycp
、pmonitor
、進行状況
、、またはブロックレベルのコピーの場合は.
rsync --progress
dd status=progress
ファイルからランダムな行をシャッフルまたは選択するために使用します。
shuf
知っているの選択肢。数値の場合は、 を使用するか、人間が読める数値 (例: from ) を処理します。キーがどのように機能するかを知っている(および)。特に、最初のフィールドのみで並べ替えるように記述する必要があることに注意してください。 行全体に従って並べ替えることを意味します。安定したソート()が便利です。たとえば、最初にフィールド 2 で並べ替え、次に次にフィールド 1 で並べ替えるには、.
sort
-n
-h
du -h
-t
-k
-k1,1
-k1
sort -s
sort -k1,1 | sort -s -k2,2
Bashのコマンドラインにタブリテラルを書き込む必要がある場合(たとえば、-t引数をソートするには)、ctrl-v [Tab]を押すか、書き込みます(コピー/貼り付けできるので後者の方が良いです)。
$'\t'
ソースコードにパッチを適用するための標準ツールは、とです。差分の要約統計量と並べて表示される差分についても参照してください。メモはディレクトリ全体に対して機能します。変更の概要に使用します。ファイルを比較および編集するために使用します。
diff
patch
diffstat
sdiff
diff -r
diff -r tree1 tree2 | diffstat
vimdiff
バイナリ ファイルの場合は、、または単純な hex ダンプの場合は 、バイナリ編集の場合は を使用します。
hd
hexdump
xxd
bvi
hexedit
biew
また、バイナリファイルの場合、(plus など)を使用すると、テキストのビットを見つけることができます。
strings
grep
バイナリ差分 (デルタ圧縮) の場合は、.
xdelta3
テキストエンコーディングを変換するには、を試してください。またはより高度な使用のために。それはいくつかの高度なユニコードのものをサポートしています。例えば:
iconv
uconv
# Displays hex codes or actual names of characters (useful for debugging):
uconv -f utf-8 -t utf-8 -x '::Any-Hex;' < input.txt
uconv -f utf-8 -t utf-8 -x '::Any-Name;' < input.txt
# Lowercase and removes all accents (by expanding and dropping them):
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC;' < input.txt > output.txt
ファイルを分割するには、(サイズで分割する場合)および(パターンで分割する場合)を参照してください。
split
csplit
日付と時刻: 現在の日付と時刻を便利な ISO 8601 形式で取得するには、 (他のオプションには問題があります)。日付と時刻の式を操作するには、、 などを使用します。日付ユーティリティから
。
date -u +"%Y-%m-%dT%H:%M:%SZ"
dateadd
datediff
strptime
、およびを使用して、圧縮ファイルを操作します。
zless
zmore
zcat
zgrep
ファイル属性はを介して設定可能で、ファイル権限の下位レベルの代替手段を提供します。たとえば、誤ってファイルが削除されないように保護するために、不変フラグは次のようになります。
chattr
sudo chattr +i /critical/directory/or/file
およびを使用して、ファイルのアクセス許可を保存および復元します。例えば:
getfacl
setfacl
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
truncate
fallocate
xfs_mkfile
mkfile
Webデバッグのために、そして便利であるか、またはそれらに相当するもの、またはより現代的なhttpie
です。
curl
curl -I
wget
現在のCPU /ディスクのステータスを知るために、従来のツールは(またはより良い)、、およびです。基本的な CPU とパーティションごとの詳細なディスク統計とパフォーマンスの分析情報に使用します。
top
htop
iostat
iotop
iostat -mxz 15
ネットワーク接続の詳細については、と を使用します。
netstat
ss
システムで何が起こっているかを簡単に概観するには、特に便利です。詳細を含む最も広い概要については、glance
を使用します。
dstat
メモリの状態を知るには、 と を実行して出力を理解します。特に、「キャッシュされた」値はLinuxカーネルによってファイルキャッシュとして保持されているメモリであるため、「空き」値に効果的にカウントされることに注意してください。
free
vmstat
Javaシステムのデバッグは別の魚のやかんですが、Oracleや他のJVMの簡単なトリックは、実行でき、完全なスタックトレースとヒープの概要(世代別ガベージコレクションの詳細を含む)がstderr / logsにダンプされます。JDK の , , , は便利です。SJKツールはより高度です。
kill -3 <pid>
jps
jstat
jstack
jmap
mtr
をより良いトレースルートとして使用して、ネットワークの問題を特定します。
ディスクがいっぱいになっている理由を確認するために、ncdu
は次のような通常のコマンドよりも時間を節約します。
du -sh *
このツール(Apacheに付属)は、Webサーバーのパフォーマンスをすばやくチェックするのに役立ちます。より複雑な負荷テストについては、.
ab
siege
について知って と .これらは、プログラムが失敗したり、ハングしたり、クラッシュしたりしていて、その理由がわからない場合や、パフォーマンスの一般的なアイデアを把握したい場合に役立ちます。プロファイルオプション () と、実行中のプロセスにアタッチする機能 () に注意してください。子オプションのトレース () を使用して、重要な呼び出しを見逃さないようにします。
strace
ltrace
-c
-p
-f
共有ライブラリなどをチェックすることを知っているが、信頼できないファイルでは絶対に実行しないでください。
ldd
実行中のプロセスに接続し、そのスタックトレースを取得する方法を知っている。
gdb
使う。ライブの問題をデバッグするときに驚くほど役立つことがあります。例: , , , , , , (ここで、はプロセス ID または pid です)。
/proc
/proc/cpuinfo
/proc/meminfo
/proc/cmdline
/proc/xxx/cwd
/proc/xxx/exe
/proc/xxx/fd/
/proc/xxx/smaps
xxx
過去に何かがうまくいかなかった理由をデバッグするとき、sar
は非常に役立ちます。CPU、メモリ、ネットワークなどの履歴統計が表示されます。
より詳細なシステムとパフォーマンスの分析については、(SystemTap)、perf
、およびsysdig
を参照してください。
stap
使用しているOSまたは(一般的なUnix /カーネル情報)または(Linuxディストリビューション情報)を確認してください。
uname
uname -a
lsb_release -a
何かが本当に面白い動作をしているときはいつでも使用してください(ハードウェアまたはドライバーの問題である可能性があります)。
dmesg
ファイルを削除しても、によって報告された予想されるディスク領域が解放されない場合は、ファイルがプロセスによって使用されているかどうかを確認します。
du
lsof | grep deleted | grep "filename-of-my-big-file"
コマンドをつなぎ合わせるいくつかの例:
sort
uniq
a
b
-T
/tmp
LC_ALL
sort
-u
sort a b | uniq > c # c is a union b
sort a b | uniq -d > c # c is a intersect b
sort a b b | uniq -u > c # c is set difference a - b
diff <(jq --sort-keys . < file1.json) <(jq --sort-keys . < file2.json) | colordiff | less -R
Use to quickly examine the contents of all files in a directory (so each line is paired with the filename), or (so each file has a heading). This can be useful for directories filled with config settings like those in , , .
grep . *
head -100 *
/sys
/proc
/etc
Summing all numbers in the third column of a text file (this is probably 3X faster and 3X less code than equivalent Python):
awk '{ x += $3 } END { print x }' myfile
ls -l
ls -lR
find . -type f -ls
acct_id
acct_id
egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
To continuously monitor changes, use , e.g. check changes to files in a directory with or to network settings while troubleshooting your wifi settings with .
watch
watch -d -n 2 'ls -rtlh | tail'
watch -d -n 2 ifconfig
Run this function to get a random tip from this document (parses Markdown and extracts an item):
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
sed '/cowsay[.]png/d' |
pandoc -f markdown -t html |
xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet unesc | fmt -80 | iconv -t US
}
expr: perform arithmetic or boolean operations or evaluate regular expressions
m4: simple macro processor
yes: print a string a lot
cal: nice calendar
env: run a command (useful in scripts)
printenv: print out environment variables (useful in debugging and scripts)
look: find English words (or lines in a file) beginning with a string
cut, and : data manipulation
paste
join
fmt: format text paragraphs
pr: format text into pages/columns
fold: wrap lines of text
column: format text fields into aligned, fixed-width columns or tables
expandand : convert between tabs and spaces
unexpand
nl: add line numbers
seq: print numbers
bc: calculator
factor: factor integers
gpg
: encrypt and sign files
toe: table of terminfo entries
nc: network debugging and data transfer
socat: socket relay and tcp port forwarder (similar to
netcat)
slurm
: network traffic visualization
dd: moving data between files or devices
file: identify type of a file
tree: display directories and subdirectories as a nesting tree; like but recursive
ls
stat: file info
time: execute and time a command
timeout: execute a command for specified amount of time and stop the process when the specified amount of time completes.
lockfile: create semaphore file that can only be removed by
rm -f
logrotate: rotate, compress and mail logs.
watch: run a command repeatedly, showing results and/or highlighting changes
when-changed
: runs any command you specify whenever it sees file changed. See and as well.
inotifywait
entr
tac: print files in reverse
comm: compare sorted files line by line
strings: extract text from binary files
tr: character translation or manipulation
iconvor : conversion for text encodings
uconv
splitand : splitting files
csplit
sponge: read all input before writing it, useful for reading from then writing to the same file, e.g.,
grep -v something some-file | sponge some-file
units: unit conversions and calculations; converts furlongs per fortnight to twips per blink (see also
/usr/share/units/definitions.units)
apg: generates random passwords
xz: high-ratio file compression
ldd: dynamic library info
nm: symbols from object files
abor
wrk: benchmarking web servers
strace: system call debugging
mtr
: better traceroute for network debugging
cssh: visual concurrent shell
rsync: sync files and folders over SSH or in local file system
ngrep
: grep for the network layer
hostand : DNS lookups
dig
lsof: process file descriptor and socket info
dstat: useful system stats
glances
: high level, multi-subsystem overview
iostat: Disk usage stats
mpstat: CPU usage stats
vmstat: Memory usage stats
htop: improved version of top
last: login history
w: who's logged on
id: user/group identity info
sar
: historic system stats
ss: socket statistics
dmesg: boot and system error messages
sysctl: view and configure Linux kernel parameters at run time
hdparm: SATA/ATA disk manipulation/performance
lsblk: list block devices: a tree view of your disks and disk partitions
lshw, , , , : hardware information, including CPU, BIOS, RAID, graphics, devices, etc.
lscpu
lspci
lsusb
dmidecode
lsmodand : List and show details of kernel modules.
modinfo
fortune, , and : um, well, it depends on whether you consider steam locomotives and Zippy quotations "useful"
ddate
sl
These are items relevant only on macOS.
Package management with (Homebrew) and/or (MacPorts). These can be used to install on macOS many of the above commands.
brew
port
Copy output of any command to a desktop app with and paste input from one with .
pbcopy
pbpaste
To enable the Option key in macOS Terminal as an alt key (such as used in the commands above like alt-b, alt-f, etc.), open Preferences -> Profiles -> Keyboard and select "Use Option as Meta key".
To open a file with a desktop app, use or .
open
open -a /Applications/Whatever.app
Spotlight: Search files with and list metadata (such as photo EXIF info) with .
mdfind
mdls
Be aware macOS is based on BSD Unix, and many commands (for example , , , , ) have many subtle variations from Linux, which is largely influenced by System V-style Unix and GNU tools. You can often tell the difference by noting a man page has the heading "BSD General Commands Manual." In some cases GNU versions can be installed, too (such as and for GNU awk and sed). If writing cross-platform Bash scripts, avoid such commands (for example, consider Python or ) or test carefully.
ps
ls
tail
awk
sed
gawk
gsed
perl
To get macOS release information, use .
sw_vers
These items are relevant only on Windows.
Access the power of the Unix shell under Microsoft Windows by installing Cygwin. Most of the things described in this document will work out of the box.
On Windows 10, you can use Windows Subsystem for Linux (WSL), which provides a familiar Bash environment with Unix command line utilities.
If you mainly want to use GNU developer tools (such as GCC) on Windows, consider MinGW and its MSYS package, which provides utilities such as bash, gawk, make and grep. MSYS doesn't have all the features compared to Cygwin. MinGW is particularly useful for creating native Windows ports of Unix tools.
Another option to get Unix look and feel under Windows is Cash. Note that only very few Unix commands and command-line options are available in this environment.
You can perform and script most Windows system administration tasks from the command line by learning and using .
wmic
Native command-line Windows networking tools you may find useful include , , , and .
ping
ipconfig
tracert
netstat
You can perform many useful Windows tasks by invoking the command.
Rundll32
Install additional Unix programs with the Cygwin's package manager.
Use as your command-line window.
mintty
Access the Windows clipboard through .
/dev/clipboard
登録済みのアプリケーションから任意のファイルを開くために実行します。
cygstart
を使用して Windows レジストリにアクセスします。
regtool
Windows ドライブ パスが Cygwin の下にあり、Cygwin が Windows の下に表示されることに注意してください。を使用して、Cygwin と Windows スタイルのファイル パスの間で変換します。これは、Windows プログラムを呼び出すスクリプトで最も役立ちます。
C:\
/cygdrive/c
/
C:\cygwin
cygpath
非常に小さなタスクを除いて、コードは他の人が読むことができるように書かれています。力には責任が伴います。Bashで何かをできるという事実は、必ずしもあなたがすべきだという意味ではありません!;)
この 作品 は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。