Shell 脚本程序就是用一条条的 Shell 命令,完成复杂的任务,掌握常见 Shell 命令是编写 Shell 脚本的前提。
从本质上来说,Shell 命令就是系统提供的一个个成熟的程序,而且有的命令非常强大,比如 find
、grep
、awk
、sed
等。
本文总结了一些常用的 Shell 命令,包括文件操作、文本处理和查看系统信息等方面,希望大家能从中有所收获 :)
文件操作 在 Linux 系统中,一切皆文件,因而文件操作是 Shell 脚本最基础的操作,包括文件创建、删除、复制、移动、重命名等。
创建文件和文件夹 touch
命令主要功能是修改文件的访问时间,如果文件不存在,则创建一个空文件;但是大家都习惯用它来创建文件。
1 2 3 4 5 touch data.txt touch data1.txt data2.txt
支持大括号扩展,让 Shell 命令可以做很 cool 的事情,比如:一下子创建 100 个文件
touch
命令的其他选项
-a
只更新访问时间, 用 ls -lt -u
查看新的访问时间atime
-m
只更新修改时间, 用 ls -lt
查看新的修改时间mtime
-r
用指定文件的时间替代当前时间
-t
更新为指定时间
-c
不创建文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 touch -a hello.jstouch -m hello.jstouch -r a.js b.jsls -l .ls -lt -u .touch -t 202506071120 hello.txt
创建目录
1 2 3 4 5 6 7 8 9 10 mkdir imagesmkdir images stylesmkdir -p src/static/imagesmkdir -p -m 777 backup/codemkdir -p -m a=rwx backup/code
删除文件和文件夹 rm
命令用于删除文件或目录,-r
参数表示递归删除,即删除目录及其内容,-f
参数表示强制删除,直接删除不会提示确认。
语法:
rm file1 file2..
rm -r dir
1 2 3 4 5 6 rm data.txtrm -r dir rmdir dir
rm
命令比较危险,因为一旦删除文件或目录,就无法恢复。为了避免误删,可以使用-i
参数,即交互模式,删除文件或目录之前会提示确认。
网上流传删库跑路的段子,就是指用 rm -rf /
彻底删除服务器系统所有文件。如果不太确定的话就把 -f
换成 -i
参数。
rm
命令支持文件名通配符,如 *
、?
、[...]
等,用于匹配多个文件,同时还支持大括号扩展 {}
, 十分灵活。
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 touch {a..c}.jpgrm *.jpgtouch {a..c}.pngrm *.{jpg,png}rm *.[jpg,png] touch data{K,Q}.txtrm data[K,Q].txtrm data{K,Q}.txt rm -rf dir rm *.log rm -i *.jsrm ???rm *.??rm a*rm [ab].js
复制文件和文件夹 cp
命令用于复制文件或目录,-r
参数表示递归复制,即复制目录及其内容,-i
参数表示存在同名文件时提示确认,因为cp
默认会覆盖已有同名文件。
多种语法:
cp <srcFile> <dstFile>
cp <file1> <file2>... <dstFolder>
cp -t <dstFolder> <file1> <file2>...
cp -r <srcFolder> <dstFolder>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 cp a.jpg a2.jpgcp -r codes codes_bkcp a.js b.js srccp -t src a.js b.jscp * /tmpcp -p server.js /codes/test/server.js
存在同名文件的提示确认
1 2 cp -i data.txt lufy.txt
如果被复制的对象是文件夹,那么有两种可能: 复制源文件夹为新的目标文件夹,或者将源文件夹复制到目标文件夹中。这取决于目标文件夹是否已经存在。
1 2 3 4 5 6 7 8 9 ls -d folder*cp -r folder1 folder2cp -r folder1 folder_back
cp
命令支持文件名通配符,如 *
、?
、[...]
等,用于匹配多个文件。
移动和重命名 mv
命令用于移动文件或目录,-r
参数表示递归移动,即移动目录及其内容。如果把文件或文件夹移动到当前目录下,则相当于重命名;所以移动和重命名都用 mv
命令。
语法:
mv <oldName> <newName>
mv file1 file2... dest
1 2 3 4 5 6 7 8 9 10 11 mv a.jpg b.jpgmv a.jpg images/mv a.jpg b.jpg images/mv -i a.jpg imagesmv -u dirSrc/* dstDir
如果被移动的对象是文件夹,那么有和cp
命令相同的特性。
1 2 3 4 5 6 7 ls -d folder*mv folder1 folder2mv folder1 folder_bk
查看文件夹内容 ls
是最最最常用的命令,用于查看文件夹。个人觉得ls
很强大,可以满足我们绝大部分的需求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ls -lls -als -lhls -ltls -lSls -rls -ltrls -F | grep "/$" ls -d dir *ls -R my_projectls -lils -ln
长列表显示的时间默认是文件的修改时间 mtime, 可以通过 --time
参数指定时间类型,如 atime
、ctime
、mtime
等。
查看文件内容 cat
命令是 concatenate
的简写(意思为:连接),当然我们也可以理解它为“猫”,要查看文件内容,就用“猫”抓一下 :)
语法: cat [option] [file]...
cat
的主要功能是把多个文件的内容合并输出到标准输出。如果我们只提供一个文件,那么其实就是把该文件的内容输出到标准输出。
1 2 3 4 5 6 cat file1 file2cat file1 file2 > file3cat file1
cat
命令可以带行号输出内容
1 2 3 4 cat -n file1cat -b file1
cat
命令查看的数据源可以是文件,也可以是键盘输入,比如我们想创建一个文件,但是文件内容比较长,我们就可以使用 cat
命令,从键盘输入内容,然后输出到文件中。
按 ctrl + d 结束输入
cat
的反序词就是 tac
, tac
也是一个命令(Linux 有很多类似有意思的地方 ),它的作用就是反序序输出文件内容,即从最后一行开始输出。
less
是一个查看文件内容的强大命令,打开文件后默认也是命令模式(同 vim ), 具体用法,可以按 h
查看帮助。
u
向上翻页, d
向下翻页 ,/
或?
搜索 ,gg
跳到顶部, G
跳到底部
less 打开多个文件
:e
然后输入新文件名
:p
上一个文件
:n
下一个文件
less 书签功能
m
然后按任意字母,标记当前位置
单引号 + 之前字母,定位到对应标签
less 可以实时显示文件新增加的内容
1 2 3 4 5 ls -1 . > files.txt less -F files.txtecho new content >> files.txt
more
命令和 less
命令类似,但是 more
命令只能向下翻页,不能向上翻页,所以 more
命令的功能没有 less
命令强大。
有句戏言: more is less, less is more 是不是充满哲学的意味? :)
more
命令主要是分块显示文件内容, -5
表示显示前 5 行;因为当输出内容很长,有时回滚也很麻烦。
1 2 3 more file more -5 index.htmlcat order.tsx | more -5
head 显示文件顶部开始的若干行/字符, -n
参数用于指定末行的位置,支持负数,表示倒数第几行。
1 2 3 4 5 6 7 8 9 head -n 10 filehead -10 filehead -n -3 filehead -c 5 file
tail 显示文件末尾的若干行/字符,-n
参数用于指定首行的位置,支持负数,表示顺数第几行。
1 2 3 4 5 6 7 8 9 tail -n 3 filetail -3 filetail -f filetail -f file --pid 3012tail -f notExistFile --retry
查看文件类型 语法: file <filename>
1 2 3 4 5 file hello.txt file -i hello.txt file -N *.txt
统计文件信息 wc
命令用于统计文件中的行数、单词数、字符数等。
语法: wc [options] [file...]
1 2 3 4 5 6 7 8 9 10 wc hello.txtwc -l hello.txtwc -w hello.txtwc -c hello.txtwc -L hello.txt
查找文件和目录 find
是 linux 系统中最常用和重要的命令之一,可以根据文件名、文件大小、修改时间、权限等属性进行查找。
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 find /etc -name init-tab find /etc -name "*.conf" find . -iname server.js find . -type d -name tmp find . -type f -name "*.php" find . -maxdepth 2 -type f -name "*.js" find . -type f -name ".*" find /tmp -type f -name "*.log" -exec rm -f {} \; find . -type f ! -name "*.txt" find . -type f \( -name "*.txt" -o -name "*.sh" \) find . -type f ! -perm 777 find . -type f ! -perm /a+w find . -type f -perm /a+x find . -type f -empty find . -type d -empty find /tmp -user root find /tmp -group sudo find ~ -type f -mtime 3 find ~ -type f -mtime +3 -mtime -5 find . -type f -cmin -60 find . -type f -amin -60 find . -type f -size 50M find . -type f -size +50M -size -100M
创建软链接和硬链接 ln 命令用于创建软链接或硬链接
软链接 又称 符号链接,可以指向文件或目录, 对符号文件的读写,系统会转换为对源文件或目录的操 作, 但是删除时,仅仅删除链接文件, 链接文件和源文件由各自的 inode, 是不同的文件
硬链接 多个文件路径指向同一个文件(inode 相同), 其实是创建另一个文件路径,指向同一个 inode, 硬链接只能指向文件,硬链接数为 0,文件才真正被删除
语法:
ln <src> <dstLink>
ln -s <src> <dstLink>
1 2 3 4 5 ln hello.txt /tmp/hello.txtln -s images /tmp/images
文件和目录权限 三种角色的权限
文件夹的执行权限(x) 控制用户能否打开文件夹
语法:chmod [ugoa] [+-=][rwxug] file...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 chmod a+x hi.jschmod a=rx hi.jschmod o-x hi.jschmod 777 hi.jschmod u=g hi.jschmod u=o hi.jschmod -R 664 dir find . -type d -exec chmod -R 775 {} \;
修改文件/目录的所有者/所有组
语法:
chown <user> dir
chgrp <group> dir
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 chown alice:pan codeschown -R alice srcchgrp pan codeschown :lucy imageschown alice:lucy images_symlinkchown -h alice:lucy images_symlinkchown --from=alice lucy:lucy images
设置用户和组的权限位
setuid
设置用户标识 允许用户以所有者权限执行文件
setgid
设置组标识 允许用户以所属组的权限执行文件
注意: 若对文件设置 setuid
权限位,且文件所有者是 root, 则任意用户都可以用 root 权限执行该文件
stat
命令十分有用,可以查看文件完整的信息,包括权限和修改时间等
查看是否设置 setuid
, setgid
权限位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ls -l /usr/bin/passwdstat /usr/bin/passwdchmod u+s hello.shchmod 4775 hello.shchmod g+s hello.shchmod 2775 hello.shchmod 0775 hello.sh
文本处理 文本排序 sort
将文本的行排序,字母顺序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sort filenamesort -n filenamesort -nr filenamesort -u filenamesort -u data data2sort -t ',' -k2 datasort -t ',' -k2 -n -r data
文本去重 uniq
去除重复的行,必须和 sort
命令一起使用
语法:uniq [options] [input_file]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 sort data | uniq sort data | uniq -csort data | uniq -dsort data | uniq -Dsort data | uniq -d -csort data | uniq -usort data | uniq -w 2sort data | uniq -w 2 -Dsort data | uniq -s 3uniq -f 1 text
删除和替换字符 语法: tr [OPTION]... SET1 [SET2]
tr
命令用于转换、删除和压缩重复字符tr set1 set2
set1 对应位置的字符被替换为 set2 对应位置的字符
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 echo linuxShell | tr lin LIN echo how are you | tr a-z A-Z echo {linuxShell} > source.txttr '{}' '()' < source.txt > result.txt cat result.txtecho "it is a long time" | tr [:space:] "\t" echo "hello----world" | tr -s "-" " " echo "LongTimeAgo" | tr -d a-z echo "hello123" | tr -d 0-9echo "it is time 2:30" | tr -d [:digit:] echo "it is time 2:30" | tr -c -d [:digit:]
文本搜索 grep
是非常强大的文本查询命令, 可以用来查询文本或者文件, 只显示匹配的行
语法: grep [OPTIONS] PATTERN [FILE...]
grep pattern file
grep -e pattern -f file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 grep alice /etc/passwd grep -i one content.txt grep -r console src/utils grep -r -l console src/utils grep -w one content.txt grep -c one content.txt grep -n one content.txt grep -v one content.txt
文件比较 diff
比较两个文件的差异
语法: diff [option] file1 file2
1 2 3 4 5 6 7 8 9 10 diff -w file1 file2 diff -y file1 file2 diff -y -w file1 file2 diff -y -W 100 file1 file2 diff -cw file1 file2
其他常用命令 查看主机名 hostname
查看/修改系统的主机名
1 2 3 4 5 6 7 hostname sudo hostname my-notebook sudo hostname -F host.txt
查看登录用户 w
who
命令
1 2 3 4 5 6 7 8 9 10 11 12 13 w who who -b who -l who -m who -r
显示系统运行时间
语法:uptime [option]
查看系统信息 语法: uname [option]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 uname -a uname uname -n uname -r uname -m uname -p uname -i uname --help
显示和设置日期 语法: date [option] [+format]
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 date date --date '20/2/2012' date --date ='1 Oct 2012' date --date ='next week' date --date ='last month' date --date ='2 months ago' date --date ='last day' date -f date.txt sudo date --set 'last day' date -u stat host.txtdate -r host.txt date +%Y-%m-%d
查看用户id 语法: id [options] [username]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 id id -uid -u root id -un id -gid -gn id -G id -Gnid -Gn alice
总结 作为一个开发者,我发现掌握Linux命令真的能让我事半功倍。
当我需要处理一大堆日志文件时,用 grep 快速搜索关键字比手动查找快了不知道多少倍。有时候需要重命名几十个文件,用 mv 配合通配符一下子就能搞定,再也不用手动一个个改名了。
最让我印象深刻的是,当我需要分析服务器上的问题时,用 tail -f 实时查看日志,用 find 快速定位问题文件,这些命令组合起来就像我的”问题排查工具箱”,帮我快速定位和解决问题。
特别是在云服务器上部署项目时,没有图形界面,全靠命令行操作。如果不懂这些命令,我根本没法完成部署工作。
说实话,刚开始觉得命令行很枯燥,但用习惯了才发现它真的很强大。现在我每天都会用到这些命令,它们已经成为我工作中不可缺少的工具了。学会这些命令,我觉得是每个想在技术路上走得更远的人必须要做的事情。