作为一名Linux系统管理员,掌握文本文件的基本操作是必备技能。让我们从最基础的I/O重定向开始讲起。
在Linux系统中,每个进程默认会打开三个文件描述符:
重定向的本质就是改变这些默认的输入输出目标。举个例子,当你想把命令的输出保存到文件而不是显示在终端时:
bash复制ls -l > filelist.txt
这里的>符号就是将标准输出重定向到filelist.txt文件。如果文件已存在,内容会被覆盖;如果想追加内容,可以使用>>:
bash复制date >> log.txt
注意:重定向操作符与文件名之间可以有空格,但建议养成不加空格的习惯,这样可以减少输入错误。
/dev/null是Linux系统中的一个特殊设备文件,它就像一个"黑洞"——所有写入它的数据都会被丢弃。这在以下场景特别有用:
bash复制noisy_command > /dev/null
bash复制risky_command 2> /dev/null
bash复制troublesome_command &> /dev/null
让我们解析两个常见的重定向表达式:
&> /dev/null:这是将标准输出和标准错误都重定向到/dev/null的简写形式。等效于> /dev/null 2>&1
2>> file:这表示将标准错误以追加的方式重定向到file文件。数字2代表标准错误的文件描述符。
实际工作中,我经常用这些技巧来处理日志。比如,只记录错误信息而忽略正常输出:
bash复制backup_script > /dev/null 2>> error.log
管道(|)是Linux命令行中最强大的特性之一。它允许你将一个命令的输出直接作为另一个命令的输入。例如:
bash复制ps aux | grep nginx
这个命令组合先列出所有进程,然后筛选出包含"nginx"的行。管道的关键特点:
与重定向的区别在于:
tee命令就像一个"T型接头",它能同时将数据送到文件和标准输出。典型使用场景:
bash复制complex_pipeline | tee debug.log | next_command
bash复制dmesg | tee /var/log/dmesg.current | less
bash复制echo "new config" | sudo tee /etc/config.file > /dev/null
技巧:使用
tee -a可以追加内容而不是覆盖文件。
Vim(Vi IMproved)是传统Vi编辑器的增强版,具有以下优势:
在大多数现代Linux发行版中,vi命令实际上是指向vim的符号链接。可以通过vim --version查看你的Vim版本信息。
普通模式(Normal mode):
h/j/k/l:左/下/上/右移动dd:删除当前行yy:复制当前行p:粘贴u:撤销Ctrl+r:重做插入模式(Insert mode):
i进入,可输入文本Esc返回普通模式a:在当前字符后插入o:在当前行下方新建一行A:在行尾插入可视模式(Visual mode):
v进入字符选择Shift+v进入行选择Ctrl+v进入块选择命令行模式(Command-line mode):
:进入:w 保存:q 退出:wq 保存并退出:q! 强制退出不保存:/pattern 搜索实用技巧:在普通模式下,
Ctrl+g可以显示当前光标位置信息;gg跳到文件开头,G跳到文件末尾。
Shell会话是用户与Linux内核之间的交互接口。每个终端窗口或SSH连接都会创建一个新的Shell会话。关键特性:
检查当前Shell类型:
bash复制echo $SHELL
ps -p $$
Shell变量:
bash复制var_name=value
环境变量:
export命令设置:bash复制export VAR_NAME=value
查看所有环境变量:
bash复制env
printenv
查看特定环境变量:
bash复制echo $PATH
PATH变量决定了Shell在哪些目录中查找可执行文件。格式是以冒号分隔的目录列表:
bash复制echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
当你在命令行输入一个命令时,Shell会按顺序在这些目录中查找匹配的可执行文件。
添加新路径到PATH:
bash复制export PATH=$PATH:/new/path
重要提示:修改PATH时要小心,错误的设置可能导致系统命令无法执行。建议先在当前会话测试,确认无误后再写入配置文件。
Linux中有多个配置文件用于设置环境变量,它们的加载顺序和作用范围各不相同:
/etc/profile:
/etc/bash.bashrc:
~/.bash_profile:
~/.bashrc:
~/.bash_logout:
登录Shell:
/etc/profile~/.bash_profile → 通常会在其中调用~/.bashrc非登录Shell:
~/.bashrc最佳实践:将环境变量定义放在
~/.bash_profile中,将别名和函数放在~/.bashrc中,并在~/.bash_profile中加入以下内容确保一致性:
bash复制if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
bash复制command > output.log 2> error.log
bash复制command > logfile 2>&1
bash复制exec 3>&1 # 保存stdout到描述符3
command >&3 # 输出到原stdout
exec 3>&- # 关闭描述符3
快速移动:
w:下一个单词开头b:上一个单词开头0:行首$:行尾Ctrl+f/Ctrl+b:向前/后翻页高效编辑:
ci":修改双引号内的内容dtx:删除直到字符x>>:缩进当前行:%s/old/new/g:全局替换多窗口操作:
:sp:水平分割窗口:vsp:垂直分割窗口Ctrl+w+方向键:切换窗口bash复制${var:-default} # 如果var未设置,使用default
${var:=default} # 如果var未设置,设置它为default
bash复制${#var} # 获取字符串长度
${var:2:4} # 从位置2开始取4个字符
${var#pre} # 删除最短匹配的前缀
${var%suf} # 删除最短匹配的后缀
bash复制arr=(a b c) # 定义数组
echo ${arr[1]} # 访问元素
echo ${#arr[@]} # 数组长度
命令找不到:
which command查找命令位置脚本权限问题:
chmod +x script.sh#!/bin/bash环境变量不生效:
source ~/.bashrc重新加载配置Vim异常行为:
~/.vimrc配置文件vim -u NONE跳过配置启动掌握这些Linux文本操作的基础知识后,你会发现命令行工作效率大幅提升。记住,熟练来自于实践,建议在日常工作中多尝试这些命令和技巧。