39 KiB
🌍 Čeština ∙ Deutsch ∙ Ελληνικά ∙ English ∙ Español ∙ Français ∙ Italiano ∙ 日本語 ∙ 한국어 ∙ Português ∙ Русский ∙ Slovenščina ∙ Українська ∙ 简体中文 ∙ 繁體中文
Arta liniei de comandă
- Meta
- Bazele
- Folosire zilnică
- Procesarea fișierelor și a datelor
- [Depanarea sistemului](#depanarea sistemului)
- Comenzi de o linie
- Obscure dar utile
- Doar pentru OS X
- Doar pentru Windows
- Mai multe resourse
- Anunț legal
A folosi linia de comandă în mod eficient este o abilitate ignorată și/sau considerată obscură, dar ajută la creșterea flexibilității și productivității ca inginer. Acest ghid reprezintă o selecție de note și sfaturi pe care le-am găsit utile lucrului în Linux. Unele sfaturi sunt elementare, altele sunt foarte specifice, sofisticate sau obscure. Pagina nu este foarte lungă, dar dacă memorați și folosiți lucrurile de aici atunci știți o cantitate semnificativă de informație.
Această muncă este rezultatul eforturilor multor autori și translatori. Multe dintre aceste sfaturi au apărut original pe Quora, și au fost mutat pe GitHub ulteror, unde alți oameni talentați au produs numeroase îmbunătățiri. Vă rugăm întrebați dacă aveți nelămuriri legate de linia de comandă. Contribuiți dacă identificați o eroare sau ceva ce ar putea fi îmbunătățit!
Meta
Scop:
- Acest ghid este atât pentru începători cât și pentru avansați. Scopurile sunt acoperire (tot ce este important), specificitate (oferirea exemplelor concrete pentru cazurilor comune) și brevitate (neincluderea lucrurilor neesențiale sau a digresiunilor ce pot fi găsite ușor în alte părți). Fiecare sfat este esențial în câteva situații sau reduce semnificativ timpul necesar efectuării unei cerințe comparativ cu celelalte alternative.
- Ghidul este scris pentru Linux, cu excepția secțiunilor "Doar pentru OS X" și "Doar pentru Windows". Majoritatea sfaturilor din celelate secțiuni se aplică/pot fi instalate pe alte sisteme Unix sau OS X (chiar și în Cygwin).
- Scopul este pe Bash interactiv, chiar dacă unele sfaturi sunt aplicabile și altor shell-uri sau pentru Bash-scripting în general.
- Atât comenzile Unix "standard" cât și cele care necesită instalarea de pachete speciale sunt incluse -- cât timp sfaturile sunt destul de importante cât să merite incluziunea.
Note:
- Pentru a păstra totul într-o singură pagină, conținutul este inclus implicit doar prin referințe. Suntem siguri că puteți căuta mai multe detalii după ce aveți ideea/comanda după care să căutați. Folosiți
apt-get
,yum
,dnf
,pacman
,pip
saubrew
(după caz) pentru a instala programe noi. - Folosiți Explainshell pentru a obține un util îndrumar în ce anumite comenzi, opțiuni, etc. fac.
Bazele
-
Învățați folosirea de bază a Bash. De fapt, tastați
man bash
și treceți măcar pe diagonală prin tot conținutul; este ușor de citit și nu este prea lung. Shell-uri alternative pot fi frumoase, dar Bash este puternic și disponibil mereu (a învăța doar zsh, etc., chiar dacă e tentant pe laptopul propriu, vă restricționează în anumite situații, cum ar fi în folosirea unor servere existente). -
Învățați cel puțin un editor de text. Ideal Vim (
vi
), cum nu există un competitor real pentru editarea în terminal (chiar dacă folosiți Emacs, sau un editor modern în majoritatea timpului). -
Învățați să citiți documentație cu
man
(pentru curiouși,man man
listează secțiunile, de exemplu 1 este pentru comenzi "uzuale", 5 este pentru fișiere/convenții și 8 pentru administrare). Găsiți pagini de manual cuapropos
. Rețineți că anumite comenzi nu sunt executable ci comenzi interne în Bash și că puteți obține ajutor despre ele cuhelp
sauhelp -d
. Puteți vedea dacă o comandă este internă, executabilă sau doar un alias prin folosireatype command
. -
Învățați despre redirectarea intrării și ieșirii folosint
>
și<
și pipe-uri cu|
. Rețineți că>
suprascrie fișierul și>>
adaugă la final. Învățați despre ieșirea standard și ieșirea de eroare standard. -
Învățați despre expandarea numelor de fișiere cu
*
(și poate?
și[
...]
) și despre folosirea și diferențele dintre"
și'
. (Vedeți mai multe în secțiunea despre expandarea variabilelor mai jos). -
Familiarizați-vă cu managementul job-urilor în Bash:
&
, ctrl-z, ctrl-c,jobs
,fg
,bg
,kill
, etc. -
Învățați
ssh
, și bazele autentificării fără parolă, viassh-agent
,ssh-add
, etc. -
Managementul de bază al fișierelor:
ls
șils -l
(în special, învățați ce reprezintă fiecare coloană dinls -l
),less
,head
,tail
șitail -f
(sau, mai bine,less +F
),ln
șiln -s
(aprofundați diferențele și avantajele între link-urile hard și cele soft),chown
,chmod
,du
(scurt sumar de folosire:du -hs *
). Pentru managementul sistemului de fișiere:df
,mount
,fdisk
,mkfs
,lsblk
. Învățați ce este un inode (ls -i
saudf -i
). -
Concepte de bază de rețea:
ip
sauifconfig
,dig
. -
Învățați și folosiți un sistem de versionare, precum
git
. -
Învățați expresii regulare foarte bine, precum și diversele opțiuni pentru
grep
/egrep
. Relevante sunt-i
,-o
,-v
,-A
,-B
, și-C
. -
Învațați să folosiți
apt-get
,yum
,dnf
saupacman
(în funcție de distribuție) pentru a găsi și instala pachete. Fiți siguri că avețipip
pentru a instala comenzile bazate pe Python (câteva din utilitarele de mai jos sunt mai ușor de instalat cupip
).
Folosire zilnică
-
În Bash, folosiți Tab pentru a completa argumente sau a lista comenzile disponibile și ctrl-r pentru a căuta în istoricul comenzilor (după apăsare, tastați ce căutați și apăsați repetat ctrl-r pentru a cicla prin lista de potriviti, apăsați Enter pentru a executa comanda găsită sau săgeată dreapta pentru a putea edita linia curentă).
-
În Bash, folosiți ctrl-w pentru a șterge ultimul cuvânt și ctrl-u pentru a șterge până la începutul liniei. Folosiți alt-b și alt-f pentru a naviga cuvânt-cu-cuvânt, ctrl-a pentru a muta cursorul la începutul liniei, ctrl-e pentru a-l muta la final, ctrl-k pentru a șterge până la finalul liniei, ctrl-l pentru a curăța tot ecranul. Vizualizați
man readline
pentru a vedea toate tastele implicite din Bash. Sunt o mulțime. De exemplu, alt-. ciclează prin toate argumentele anterioare și alt-* expandează un glob pattern. -
Alternativ, dacă doriți să folosiți tastele ca în vi, folosiți
set -o vi
(șiset -o emacs
pentru a vă întoarce). -
Pentru a edita comenzi lungi, după setarea editorului (de exemplu
export EDITOR=vim
), ctrl-x ctrl-e va deschide un editor cu comanda curentă pentru editare. În stilul vi puteți folosi escape-v. -
Comenzile recente le găsiți folosind
history
. Dacă folosiți!n
(unden
este numărul comenzii) atunci o veți executa din nou. Sunt mai multe scurtături pe care le puteți folosi, foarte utile fiind!$
pentru ultimul argument și!!
pentru ultima comandă (vedeți "HISTORY EXPANSION" în manual). Acestea pot fi înlocuite ușor cu ctrl-r și alt-.. -
Navigați către directorul personal cu
cd
. Accesați fișiere relative la acest director cu prefixul~
(e.g.~/.bashrc
). În scripturilesh
, referiți-vă la directorul personal cu$HOME
. -
Pentru a ajunge înapoi în directorul anterior:
cd -
. -
Dacă sunteți în mijlocul editării unei comenzi dar vreți să renunțați, folosiți alt-# pentru a adăuga un
#
la început și a o introduce ca un comentariu (alternativ, ctrl-a, #, enter). Vă puteți întoarce la comandă mai târziu, folosind istoria comenzilor. -
Folosiți
xargs
(sauparallel
). Este foarte puternic. Puteți controla câte comenzi execută pe o linie (-L
) și paralelismul (-L
). Dacă nu sunteți siguri că ați dat comanda corectă, folosiți întâixargs echo
. De asemenea,-I{}
este foarte ultil. Exemple:
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
-
pstree -p
este o modalitate ușoară de a afișa lista de procese -
Folosiți
pgrep
șipkill
pentru a găsi și semnala procesele după nume (-f
poate fi util). -
Învățați ce semnale pot fi trimise proceselor. De exemplu, pentru a suspenda un proces puteți folosi
kill -STOP [pid]
. Pentru a obține lista completă, vedețiman 7 signal
. -
Folosiți
nohup
saudisown
dacă doriți să trimiteți un proces în fundal sau să-l mențineți rulând permanent. -
Verificați ce procese ascultă pe rețea folosind
netstat -lntp
sauss -plat
(pentru TCP; adăugați-u
pentru UDP). -
Vedeți
lsof
pentru fișiere și socket-uri deschise. -
Vedeți
uptime
sauw
pentru a afla cât timp sistemul a fost funcțional. -
Folosiți
alias
pentru a crea scurtături pentru comenzile folosie des. De exemplu,alias ll='ls -latr'
creează un nou aliasll
. -
Salvați alias-uri, setări shell, și funcții folosite frecvent în
~/.bashrc
, și instruiți shell-ul de login să-l citească. Asftel, veți avea aceleași setări în toate terminalele. -
Salvați setările variabilelor de mediu și comenzile care ar trebui executate la login în
~/.bash_profile
. Configurări separate sunt necesare pentru shell-uri lansate prin logarea în mediul grafic sau din task-uricron
. -
Sincronizați fișierele de configurare (e.g.
.bashrc
and.bash_profile
) între mai multe calculatoare folosind Git. -
Tratați cu atenți cazurile când variabilele și fișierele conțin spații. Folosiți ghilimele în acest caz, de exemplu
"$FOO"
. Preferați să folosiți opțiunile-0
sau-print0
pentru a folosi caracterul null pentru a delimita fișierele, de exemplulocate -0 pattern | xargs -0 ls -al
saufind / -print0 -type d | xargs -0 ls -al
. Pentru a parcurge o listă de fișiere conținând spații într-o buclă for, setați variabile IFS la terminatorul de linie,IFS=$'\n'
. -
În scripturile Bash, folosiți
set -x
(sau variantaset -v
, care produce informație neprocesată, inclusiv variabile neexpandate și comentarii) pentru a depana outputul. Folosiți modurile strice exceptând când aveți un motiv foarte bun împotrivă: folosițiset -e
pentru a termina execuția în caz de eroare (cod de ieșire nenul). Folosițiset -u
pentru a detecta variable nesetate. Considerați folosireaset -o pipefail
pentru erorile cauzate de folosirea eronată a pipe-urilor. Pentru scripturi mai complicate, folosițitrap
pentru EXIT sau ERR. Un obicei util este să începeți scriptul într-o modalitate care va permite detecția facilă a erorilor și terminarea execuției cu un mesaj:
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
- În scripturile Bash, subshell-urile (delimitate de paranteze) sunt un mod convenabil pentru a grupa comenzi. De exemplu, va puteți muta într-un alt director:
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
-
În Bash, există mai multe variante de expandare a variabilelor. Verifacți dacă o variabilă există:
${name:?error message}
. De exemplu, dacă un script necesită un argument unic, folosițiinput_file=${1:?usage: $0 input_file}
. Folosți o valoare implicită pentru cazul când o variabilă este goală:${name:-default}
. Pentru parametri opționali în exemplul anterior, folosițioutput_file=${2:-logfile}
. Dacă$2
este omis (gol),output_file
va fi setat lalogfile
. Expandare aritmetică:i=$(( (i + 1) % 5 ))
. Secvențe:{1..10}
. Tăierea unor secvențe din șiruri:${var%suffix}
și${var#prefix}
. De exemplu, dacăvar=foo.pdf
, atunciecho ${var%.pdf}.txt
va scriefoo.txt
. -
Expandarea parantezelor folosind
{
...}
previne re-tastarea textelor similare, automatizând combinațiile de itemuri. Este util în exemple precummv foo.{txt,pdf} some-dir
(care mută ambele fișiere),cp somefile{,.bak}
(care se expandează lacp somefile somefile.bak
) saumkdir -p test-{a,b,c}/subtest-{1,2,3}
(care expandează toate combinațiile posibile și creează arborele de directoare). -
Outputul unei comenzi poate fi tratat ca un fișier cu
<(some command)
. De exemplu, pentru a compara fișierul/etc/hosts
local cu unul la distanță:
diff /etc/hosts <(ssh somehost cat /etc/hosts)
- Când scrieți cod, puteți prefera să încadrați tot codul în acolade. Dacă acolada de final lipsește, scriptul nu va rula. Este un lucru util, în special pentru scripturile de pe web pentru că previne execuția scripturilor parțial descărcate:
{
# Your code here
}
-
Folosiți "here documents", de exemplu
cat <<EOF ...
. -
În Bash, redirectați ieșirea standard și eroarea standard cu
some-command >logfile 2>&1
sausome-command &>logfile
. De regulă, pentru a vă asigura că o comandă nu lasă un fișier deschis, fiind legată de terminalul curent, este o practică bună să adăugați</dev/null
. -
Folosiți
man ascii
pentru o tabelă ASCII foarte bună, cu valori în hex și decimal. Pentru informatii generale de codificare,man unicode
,man utf-8
, șiman latin1
sunt utile. -
Folosiți
screen
sautmux
pentru a multiplexa terminalul, în special în cazul sesiunilor ssh.byobu
poate îmbunătăți screen sau tmux fiind mai ușor de folosit. O interfață minimală pentru persistența sesiunilor estedtach
. -
În ssh, este util să știți cum să tunelați cu
-L
sau-D
(și ocazional-R
), e.g. pentru a accesa site-uril de pe un server remote. -
Este foarte util să optimizați configurațiile ssh, de exemplu, setarea următoare din
~/.ssh/config
permite prevenția sesiunilor eșuate în anumite condiții de rețea, folosește compresia (utilă pentruscp
sau conexiuni peste rețele cu lățime de bandă redusă) și multiplexează canale către același server folosind un fișier de control local:
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
-
Un număr de alte opțiuni sunt relevante pentru securitate și trebuiesc tratate cu atenție, de exemplu, setări pe rețea sau mașină:
StrictHostKeyChecking=no
,ForwardAgent=yes
-
Considerați folosirea
mosh
ca o alternativă la ssh care folosește UDP, prevenind conexiunile eșuate (neceistă setup pe partea de server). -
Pentru a obține permisiunile unui fișier în forma octală, lucru util pentru configurarea sistemului, dar nedisponibil în
ls
, folosiți ceva precum:
stat -c '%A %a %n' /etc/timezone
-
Pentru selecția interactivă a valorilor dintr-o altă comandă, folosiți
percol
saufzf
. -
Pentru interacțiunea cu fișiere rezultate din outputul unei alte comenzi (like
git
), folosițifpp
(PathPicker). -
Un simplu server web pentru fișierele din directorul curent și subdirectoare, disponibil pentru toți din rețeaua dumneavoastră, folosiți
python -m SimpleHTTPServer 7777
(pentru port 7777 și Python 2) șipython -m http.server 7777
(pentru port 7777 și Python 3). -
Puteți rula o comandă ca un alt user folosind
sudo
. Implicit se va rula ca root, folosiți-u
pentru a specifica utilizatorul. Folosiți-i
pentru a vă loga ca acel utilizator, folosind parola voastră. -
Pentru a schimba tot shellul către alt user, folosiți
su username
sausu - username
. Versiunea cu-
obține și mediul, ca si cum userul tocmai s-a logat. Username-ul implicit este root. Veți fi întrebat parola utilizatorului către care faceți schimbarea. -
Amintițivă că orice linie de comandă are o limită de 128K. Eroarea "Argument list too long" (listă de argumente prea lungă) este comună dacă un număr mare de fișiere se potrivesc unui șablon. (În acest caz, alternative precum
find
șixargs
ajută.) -
Un calculator în bash poate fi obținut prin access to Python:
python
:
>>> 2+3
5
Processing files and data
-
To locate a file by name in the current directory,
find . -iname '*something*'
(or similar). To find a file anywhere by name, uselocate something
(but bear in mindupdatedb
may not have indexed recently created files). -
For general searching through source or data files (more advanced than
grep -r
), useag
. -
To convert HTML to text:
lynx -dump -stdin
-
For Markdown, HTML, and all kinds of document conversion, try
pandoc
. -
If you must handle XML,
xmlstarlet
is old but good. -
For JSON, use
jq
. -
For YAML, use
shyaml
. -
For Excel or CSV files, csvkit provides
in2csv
,csvcut
,csvjoin
,csvgrep
, etc. -
For Amazon S3,
s3cmd
is convenient ands4cmd
is faster. Amazon'saws
and the improvedsaws
are essential for other AWS-related tasks. -
Know about
sort
anduniq
, including uniq's-u
and-d
options -- see one-liners below. See alsocomm
. -
Know about
cut
,paste
, andjoin
to manipulate text files. Many people usecut
but forget aboutjoin
. -
Know about
wc
to count newlines (-l
), characters (-m
), words (-w
) and bytes (-c
). -
Know about
tee
to copy from stdin to a file and also to stdout, as inls -al | tee file.txt
. -
For more complex calculations, including grouping, reversing fields, and statistical calculations, consider
datamash
. -
Know that locale affects a lot of command line tools in subtle ways, including sorting order (collation) and performance. Most Linux installations will set
LANG
or other locale variables to a local setting like US English. But be aware sorting will change if you change locale. And know i18n routines can make sort or other commands run many times slower. In some situations (such as the set operations or uniqueness operations below) you can safely ignore slow i18n routines entirely and use traditional byte-based sort order, usingexport LC_ALL=C
. -
You can set a specific command's environment by prefixing its invocation with the environment variable settings, as in
TZ=Pacific/Fiji date
. -
Know basic
awk
andsed
for simple data munging. For example, summing all numbers in the third column of a text file:awk '{ x += $3 } END { print x }'
. This is probably 3X faster and 3X shorter than equivalent Python. -
To replace all occurrences of a string in place, in one or more files:
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
- To rename multiple files and/or search and replace within files, try
repren
. (In some cases therename
command also allows multiple renames, but be careful as its functionality is not the same on all Linux distributions.)
# 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
- As the man page says,
rsync
really is a fast and extraordinarily versatile file copying tool. It's known for synchronizing between machines but is equally useful locally. When security restrictions allow, usingrsync
instead ofscp
allows recovery of a transfer without restarting from scratch. It also is among the fastest ways to delete large numbers of files:
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
-
Use
shuf
to shuffle or select random lines from a file. -
Know
sort
's options. For numbers, use-n
, or-h
for handling human-readable numbers (e.g. fromdu -h
). Know how keys work (-t
and-k
). In particular, watch out that you need to write-k1,1
to sort by only the first field;-k1
means sort according to the whole line. Stable sort (sort -s
) can be useful. For example, to sort first by field 2, then secondarily by field 1, you can usesort -k1,1 | sort -s -k2,2
. -
If you ever need to write a tab literal in a command line in Bash (e.g. for the -t argument to sort), press ctrl-v [Tab] or write
$'\t'
(the latter is better as you can copy/paste it). -
The standard tools for patching source code are
diff
andpatch
. See alsodiffstat
for summary statistics of a diff andsdiff
for a side-by-side diff. Notediff -r
works for entire directories. Usediff -r tree1 tree2 | diffstat
for a summary of changes. Usevimdiff
to compare and edit files. -
For binary files, use
hd
,hexdump
orxxd
for simple hex dumps andbvi
orbiew
for binary editing. -
Also for binary files,
strings
(plusgrep
, etc.) lets you find bits of text. -
For binary diffs (delta compression), use
xdelta3
. -
To convert text encodings, try
iconv
. Oruconv
for more advanced use; it supports some advanced Unicode things. For example, this command lowercases 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
-
To split files into pieces, see
split
(to split by size) andcsplit
(to split by a pattern). -
To manipulate date and time expressions, use
dateadd
,datediff
,strptime
etc. fromdateutils
. -
Use
zless
,zmore
,zcat
, andzgrep
to operate on compressed files. -
File attributes are settable via
chattr
and offer a lower-level alternative to file permissions. For example, to protect against accidental file deletion the immutable flag:sudo chattr +i /critical/directory/or/file
-
Use
getfacl
andsetfacl
to save and restore file permissions. For example:
getfacl -R /some/path > permissions.txt
setfacl --restore=permissions.txt
System debugging
-
For web debugging,
curl
andcurl -I
are handy, or theirwget
equivalents, or the more modernhttpie
. -
To know current cpu/disk status, the classic tools are
top
(or the betterhtop
),iostat
, andiotop
. Useiostat -mxz 15
for basic CPU and detailed per-partition disk stats and performance insight. -
For network connection details, use
netstat
andss
. -
For a quick overview of what's happening on a system,
dstat
is especially useful. For broadest overview with details, useglances
. -
To know memory status, run and understand the output of
free
andvmstat
. In particular, be aware the "cached" value is memory held by the Linux kernel as file cache, so effectively counts toward the "free" value. -
Java system debugging is a different kettle of fish, but a simple trick on Oracle's and some other JVMs is that you can run
kill -3 <pid>
and a full stack trace and heap summary (including generational garbage collection details, which can be highly informative) will be dumped to stderr/logs. The JDK'sjps
,jstat
,jstack
,jmap
are useful. SJK tools are more advanced. -
Use
mtr
as a better traceroute, to identify network issues. -
For looking at why a disk is full,
ncdu
saves time over the usual commands likedu -sh *
. -
To find which socket or process is using bandwidth, try
iftop
ornethogs
. -
The
ab
tool (comes with Apache) is helpful for quick-and-dirty checking of web server performance. For more complex load testing, trysiege
. -
For more serious network debugging,
wireshark
,tshark
, orngrep
. -
Know about
strace
andltrace
. These can be helpful if a program is failing, hanging, or crashing, and you don't know why, or if you want to get a general idea of performance. Note the profiling option (-c
), and the ability to attach to a running process (-p
). -
Know about
ldd
to check shared libraries etc. -
Know how to connect to a running process with
gdb
and get its stack traces. -
Use
/proc
. It's amazingly helpful sometimes when debugging live problems. Examples:/proc/cpuinfo
,/proc/meminfo
,/proc/cmdline
,/proc/xxx/cwd
,/proc/xxx/exe
,/proc/xxx/fd/
,/proc/xxx/smaps
(wherexxx
is the process id or pid). -
When debugging why something went wrong in the past,
sar
can be very helpful. It shows historic statistics on CPU, memory, network, etc. -
For deeper systems and performance analyses, look at
stap
(SystemTap),perf
, andsysdig
. -
Check what OS you're on with
uname
oruname -a
(general Unix/kernel info) orlsb_release -a
(Linux distro info). -
Use
dmesg
whenever something's acting really funny (it could be hardware or driver issues). -
If you delete a file and it doesn't free up expected disk space as reported by
du
, check whether the file is in use by a process:lsof | grep deleted | grep "filename-of-my-big-file"
One-liners
A few examples of piecing together commands:
- It is remarkably helpful sometimes that you can do set intersection, union, and difference of text files via
sort
/uniq
. Supposea
andb
are text files that are already uniqued. This is fast, and works on files of arbitrary size, up to many gigabytes. (Sort is not limited by memory, though you may need to use the-T
option if/tmp
is on a small root partition.) See also the note aboutLC_ALL
above andsort
's-u
option (left out for clarity below).
cat a b | sort | uniq > c # c is a union b
cat a b | sort | uniq -d > c # c is a intersect b
cat a b b | sort | uniq -u > c # c is set difference a - b
-
Use
grep . *
to quickly examine the contents of all files in a directory (so each line is paired with the filename), orhead -100 *
(so each file has a heading). This can be useful for directories filled with config settings like those in/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
- To see sizes/dates on a tree of files, this is like a recursive
ls -l
but is easier to read thanls -lR
:
find . -type f -ls
- Say you have a text file, like a web server log, and a certain value that appears on some lines, such as an
acct_id
parameter that is present in the URL. If you want a tally of how many requests for eachacct_id
:
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
-
To continuously monitor changes, use
watch
, e.g. check changes to files in a directory withwatch -d -n 2 'ls -rtlh | tail'
or to network settings while troubleshooting your wifi settings withwatch -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 |
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
}
Obscure dar utile
-
expr
: execută operații aritmetice sau boleene și expandează expresii regulate -
m4
: procesor simplu de macro-uri -
yes
: afișează un șir de un număr infinit de ori -
cal
: calendar -
env
: execută o comandă (util în scripturi) -
printenv
: afișează variabilele de mediu (util pentru depanare și scripturi) -
look
: idenfică cuvinte în engleză (sau linii de fișier) care încep cu un șir -
cut
,paste
andjoin
: manipulează date -
fmt
: formatează paragrafe de text -
pr
: formatează textul în paragrafe și coloane -
fold
: înfășoară liniile unui text -
column
: formatează textul în coloane de lungime fixă, în tabele -
expand
șiunexpand
: convertește între tab-uri și spații -
nl
: adaugă numere liniilor -
seq
: afișează numere -
bc
: calculator -
factor
: factorizează întregi -
gpg
: criptează și semnează fișiere -
toe
: tabel de informații despre terminal -
nc
: depanare rețea și transfer de date -
socat
: socket relay și forwarder pentru porturi tcp (similar cunetcat
) -
slurm
: vizualizează traficul de rețea -
dd
: mută datele între fișiere și device-uri -
file
: identifică tipul unui fișier -
tree
: arată un arbore de directoare și subdirectoare, cals
dar recursiv -
stat
: informații despre fișier -
time
: execută și cronometrează o comandă -
timeout
: execută o comandă până la expirarea unei cantițăți de timp, omorând procesul la finalul timpului alocat -
lockfile
: creează un fișier semafor care nu poate fi șters decât curm -f
-
logrotate
: rotește, comprimă și trimite jurnalele pe mail -
watch
: execută o comandă în mod repetat, arătând rezultatele și/sau evidențiind diferențele -
tac
: afișează conținutul fișierelor în ordine inversă -
shuf
: selectează linii random din fișier -
comm
: compară fișiere sortate, linie cu linie -
pv
: monitorizează progresul datelor într-un pipe -
hd
,hexdump
,xxd
,biew
șibvi
: afișează sau editează fișiere binare -
strings
: extrage șiruri din fișiere -
tr
: translatează și manipulează caractere -
iconv
sauuconv
: conversie între codificările posibile ale unui text -
split
șicsplit
: sparge fișiere în componente -
sponge
: citește tot inputul înainte de a-l afișa, util pentru a citi și apoi a scrie în același fișier:grep -v something some-file | sponge some-file
-
units
: conversii între unități de măsură (vedeți și/usr/share/units/definitions.units
) -
apg
: generateză parole random -
xz
: compresor de fișiere foarte eficient -
ldd
: informații despre bibliotecile dinamice -
nm
: simboluri din fișierele obiect -
ab
: benchmarking pentru servere web -
strace
: depanare apeluri de sistem -
mtr
: alternative mai bună pentrutraceroute
pentru depanarea rețelei -
cssh
: shell vizual, concurent -
rsync
: sincronizează fișiere peste SSH sau local -
wireshark
șitshark
: capturează trafic de rețea și depanează rețeaua -
ngrep
: grep pentru rețea -
host
șidig
: interogări DNS -
lsof
: informații despre descriptorii de fișiere și sockeți -
dstat
: statistici utile despre sistem -
glances
: statistici utile despre sistem, la nivel înalt -
iostat
: statistici despre folosirea discului -
mpstat
: statistici despre folosirea CPU -
vmstat
: statistici despre folosirea memoriei -
htop
: versiune îmbunătățită atop
-
last
: istoria login-urilor -
w
: cine este logged-in -
id
: informații despre useri/grupuri -
sar
: istoria statisticilor despre sistem -
iftop
saunethogs
: utilizarea rețelei de fiecare socket sau proces -
ss
: statistici socket -
dmesg
: erori de sistem sau de pornirea sistemului -
sysctl
: vizualizează și configurează parametrii nucleului Linux -
hdparm
: manipulare/performanță pentru discuri SATA/ATA -
lsblk
: afișează dispozitivele block: discuri și partiții -
lshw
,lscpu
,lspci
,lsusb
,dmidecode
: informații hardware, incluzând CPU, BIOs, RAID, plăci grafice, dispozitive, etc. -
lsmod
șimodinfo
: afișează module de kernel -
fortune
,ddate
, șisl
: depinde dacă considerați locomotive și citate "utile" (utilitare distractive)
OS X only
These are items relevant only on OS X.
-
Package management with
brew
(Homebrew) and/orport
(MacPorts). These can be used to install on OS X many of the above commands. -
Copy output of any command to a desktop app with
pbcopy
and paste input from one withpbpaste
. -
To enable the Option key in OS X 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
open
oropen -a /Applications/Whatever.app
. -
Spotlight: Search files with
mdfind
and list metadata (such as photo EXIF info) withmdls
. -
Be aware OS X is based on BSD Unix, and many commands (for example
ps
,ls
,tail
,awk
,sed
) 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 asgawk
andgsed
for GNU awk and sed). If writing cross-platform Bash scripts, avoid such commands (for example, consider Python orperl
) or test carefully. -
To get OS X release information, use
sw_vers
.
Windows only
These items are relevant only on Windows.
-
On Windows 10, you can use Bash on Ubuntu on Windows, which provides a familiar Bash environment with Unix command line utilities. On the plus side, this allows Linux programs to run on Windows. On the other hand this does not support the running of Windows programs from the Bash prompt.
-
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.
-
Install additional Unix programs with the Cygwin's package manager.
-
Use
mintty
as your command-line window. -
Access the Windows clipboard through
/dev/clipboard
. -
Run
cygstart
to open an arbitrary file through its registered application. -
Access the Windows registry with
regtool
. -
Note that a
C:\
Windows drive path becomes/cygdrive/c
under Cygwin, and that Cygwin's/
appears underC:\cygwin
on Windows. Convert between Cygwin and Windows-style file paths withcygpath
. This is most useful in scripts that invoke Windows programs. -
You can perform and script most Windows system administration tasks from the command line by learning and using
wmic
. -
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.
-
An alternative option to get GNU developer tools (such as GCC) on Windows is 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.
More resources
- awesome-shell: A curated list of shell tools and resources.
- awesome-osx-command-line: A more in-depth guide for the OS X command line.
- Strict mode for writing better shell scripts.
- shellcheck: A shell script static analysis tool. Essentially, lint for bash/sh/zsh.
- Filenames and Pathnames in Shell: The sadly complex minutiae on how to handle filenames correctly in shell scripts.
- Data Science at the Command Line: More commands and tools helpful for doing data science, from the book of the same name
Disclaimer
With the exception of very small tasks, code is written so others can read it. With power comes responsibility. The fact you can do something in Bash doesn't necessarily mean you should! ;)
License
This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.