你是否有过这样的体验:在终端里敲了半天命令,结果发现输错了要重新打;想批量处理一批文件,却不知道怎么写匹配规则;想把命令的输出保存下来,结果把原文件给覆盖了……
这些“低级错误”其实不是你不小心,而是因为你还没有掌握终端里那些提升效率、避免翻车的基本功。
这篇文章不讲复杂的概念,只讲你在日常运维中一定会用到的操作技巧。学完这一篇,你的终端操作至少提速 50%。
一、命令输入的艺术:少敲键盘,多干活
1. 命令补全:Tab 键是你最好的朋友
你是不是还在一个字一个字地敲命令和路径?其实大部分时候只需要按 Tab 键就够了。
-
命令补全:输入
sys然后按 Tab,如果系统里只有一个以sys开头的命令(比如systemctl),它会自动补全;如果有多个,再按一次 Tab 会列出所有候选。 -
路径补全:输入
/etc/ng然后按 Tab,如果只有一个匹配(比如/etc/nginx),直接补全;否则再次 Tab 列出选项。
实操:打开终端,输入
ls /et然后按 Tab,看看发生了什么。
2. 命令历史:找回你刚才执行过的命令
有时候你执行了一条很长的命令,想再来一次,难道要重新敲一遍?不用。
-
按 ↑ 键可以浏览之前执行过的命令。
-
输入
history可以看到所有历史命令及编号。想重新执行第 123 条命令:!123。 -
想执行最近一次以
ssh开头的命令:!ssh。 -
想获取上一条命令的最后一个参数:
!$或者按Esc后再按.。
实操:先执行
echo hello world,然后输入!!再回车,你会发现上一条命令又被执行了一次。
3. 命令行编辑快捷键:别再用退格键慢慢删了
|
快捷键
|
作用
|
| --- | --- |
|
Ctrl + A
|
跳到行首
|
|
Ctrl + E
|
跳到行尾
|
|
Ctrl + U
|
删除光标左边所有内容
|
|
Ctrl + K
|
删除光标右边所有内容
|
|
Ctrl + W
|
删除光标左边一个单词
|
|
Ctrl + Y
|
粘贴刚刚删除的内容
|
|
Alt + F
|
向右跳一个单词
|
|
Alt + B
|
向左跳一个单词
|
|
Ctrl + L
|
清屏(相当于 clear)
|
|
Ctrl + R
|
反向搜索历史命令,输入关键字即可匹配
|
实操:输入一条长命令(比如
systemctl status sshd --no-pager),然后依次尝试Ctrl+A、Ctrl+E、Ctrl+U、Ctrl+Y,感受一下。
二、文件管理:创建、复制、移动、删除的正确姿势
1. 创建目录:mkdir 的隐藏技能
你可能知道 mkdir dirname 创建目录,但有两个选项非常实用:
-
mkdir -p a/b/c/d:自动创建所有不存在的父目录,一步到位。 -
mkdir -v dirname:显示创建过程的详细信息。 -
mkdir -m 755 dirname:创建目录的同时设定权限。
实操:
mkdir -pv /tmp/test/sub1/sub2,看看输出。
2. 复制文件:cp 的安全用法
cp 是最常用的命令之一,但也最容易出错——一不小心就把重要文件覆盖了。
-
交互模式:
cp -i source dest,覆盖前会问你确认。 -
递归复制目录:
cp -r sourcedir destdir。 -
保留所有属性:
cp -a source dest(相当于-dR --preserve=all),常用于备份。 -
复制符号链接本身:
cp -d linkfile dest,默认会复制链接指向的目标文件。
防翻车口诀:不确定时加
-i,复制目录加-r,要备份用-a。
3. 移动和重命名:mv 的妙用
mv 既可以移动文件,也可以重命名。同样建议加 -i 防止覆盖:
mv -i oldname newname # 重命名
mv -i file /tmp/ # 移动到 /tmp 目录
4. 删除文件:rm 的危险与自救
rm 是 Linux 上最危险的操作之一,尤其是 rm -rf /(千万别试)。
-
安全删除:
rm -i file逐个确认。 -
删除目录:
rm -r dir(或者更安全的rm -ri dir)。 -
强制删除:
rm -f file,不提示直接删。
黄金法则:在执行
rm -rf之前,先ls一遍确认路径是否正确。另外,养成用trash-cli(类似于回收站)的习惯可以救命。
三、查看文件内容:不止 cat 和 less
1. 快速查看:head 和 tail
-
head -n 20 file:查看文件前 20 行(默认 10 行)。 -
tail -n 20 file:查看文件后 20 行。 -
tail -f file:实时追踪文件的新增内容,查看日志的神器。按Ctrl+C退出。
实战场景:排查故障时,
tail -f /var/log/syslog可以实时看到新产生的日志。
2. 分屏阅读:more 和 less
-
more file:一页一页看,按空格翻页,看完自动退出。 -
less file:更强大,支持上下翻页、搜索(输入/keyword搜索,按n跳到下一个匹配)。man命令用的就是 less。
3. 查看文件元数据:stat 和 touch
-
stat file:查看文件的元数据,包括大小、权限、三个时间戳(Access、Modify、Change)。 -
touch file:如果文件不存在则创建空文件;如果存在则更新它的时间戳为当前时间。 -
touch -d "yesterday 14:00" file:把时间戳改成昨天下午两点。这在模拟日志时间时很有用。
实操:
touch mytest.txt && stat mytest.txt,看看输出里三个时间戳的值。
四、批量处理文件:通配符(Glob)的力量
当你有几十个文件需要操作时,一个一个敲名字太傻了。这时候就要用文件名通配符。
常用通配符
|
模式
|
含义
|
示例
|
| --- | --- | --- |
|
*
|
匹配任意长度任意字符
|
*.log 匹配所有 .log 结尾的文件
|
|
?
|
匹配任意单个字符
|
file?.txt 匹配 file1.txt、fileA.txt
|
|
[abc]
|
匹配方括号内任意一个字符
|
file[123].txt 匹配 file1.txt、file2.txt、file3.txt
|
|
[a-z]
|
匹配指定范围
|
[a-z]*.txt 匹配以小写字母开头的 txt 文件
|
|
[^abc]
|
匹配不在方括号内的字符
|
[^0-9]* 匹配不以数字开头的文件
|
|
[[:upper:]]
|
POSIX 字符类,匹配大写字母
|
等价于 [A-Z]
|
实操:先创建几个测试文件:
touch report{1..5}.log note{A,B,C}.txt,然后试试ls *.log、ls report?.log、ls note[A-C].txt。
五、数据流处理:IO 重定向和管道
这是 Linux 运维中最强大的思想之一:把命令的输入输出像水管一样连接起来。
1. 输出重定向:保存结果
-
command > file:将标准输出覆盖写入文件。 -
command >> file:将标准输出追加写入文件。 -
command 2> file:将错误输出重定向到文件。 -
command &> file:将标准输出和错误输出合并重定向。 -
command > file 2>&1:另一种合并写法,注意顺序。
防翻车:用
set -C可以禁止覆盖已有文件,防止误操作。需要覆盖时用>|。
2. 输入重定向:从文件读取
-
command < file:从文件读取输入。 -
tr 'a-z' 'A-Z' < file:将文件内容从小写转为大写(tr命令默认从标准输入读取)。
3. 管道:串联命令的魔法
管道用 | 连接,把左边命令的输出作为右边命令的输入。
cat /var/log/syslog | grep "error" | head -20
这条命令的意思是:读取日志 → 筛选出包含 error 的行 → 只显示前 20 行。
实用组合:
history | grep ssh:查找历史中所有 ssh 相关的命令。
ls -l /etc | wc -l:统计 /etc 下有多少个文件。
du -sh /* | sort -rh | head -5:找出根目录下占用空间最大的 5 个目录。
4. tee:一边输出一边保存
command | tee file
把命令的结果同时显示在屏幕并保存到文件里。调试时特别好用。
5. xargs:把文本变成命令参数
当管道传递的是文本行,而你需要把它们作为参数传给另一个命令时,用 xargs:
find /tmp -name "*.tmp" | xargs rm -f
这条命令会找到 /tmp 下所有 .tmp 文件,然后删除它们。注意:xargs 默认会把输入按空格或换行分割,如果文件名包含空格可能会出错,可以用 -0 配合 find ... -print0 处理。
6. 特殊设备:/dev/null
这是一个“黑洞”,所有写入它的数据都会被丢弃。常用于屏蔽不需要的输出:
command &> /dev/null # 安静执行,不产生任何输出
六、变量的简单认识
在 bash 中,变量就是一块命名的内存空间。你可以用它来存储值,方便复用。
name="world"
echo "Hello, $name" # 输出 Hello, world
变量的引用方式:
-
$name或${name}:弱引用,变量会被展开。 -
'$name':强引用,原样输出$name字符串。 -
`command`或$(command):命令替换,执行命令并用其输出替换。
实操:
echo "Today is $(date)",看看输出。
七、命令的执行状态
每条命令执行后都会返回一个状态码:0 表示成功,非 0 表示失败。这个状态码保存在特殊变量 $? 中。
ls /nonexist
echo $? # 输出非 0,表示上一个命令失败了
在写脚本时,可以通过检查 $? 来决定下一步操作。
八、踩坑经验汇总
-
误删文件:永远不要在不确定的情况下执行
rm -rf。建议先ls确认,或者用mv移到临时目录。 -
管道丢失数据:有些命令(如
grep)默认是缓冲输出的,可能导致管道下游迟迟收不到数据。可以用--line-buffered选项强制行缓冲。 -
通配符没展开:如果文件名里有空格,通配符展开后可能被拆成多个参数。尽量用引号包裹变量,或用
find ... -exec替代。 -
重定向顺序错误:
command 2>&1 > file是错误的,正确顺序是command > file 2>&1。因为重定向是从左到右解析的。 -
tail -f 看不到新内容:如果日志文件被轮替(logrotate)重命名了,
tail -f盯着的还是旧文件的 inode,不会跟踪新文件。这时要用tail -F(大写 F)。
总结
这篇文章涵盖了你在 Linux 终端里最常用的基本功:命令补全与历史、文件管理、内容查看、通配符、IO 重定向与管道。这些技能单个看起来都很简单,但组合起来威力巨大。