常用 Linux 命令指南(一)- Shell 基础与文本处理
Linux 命令行是系统管理和开发的基础技能。本指南将详细介绍 Linux 系统中两个非常重要的命令:echo 和 wc,并提供实际应用场景和最佳实践。
Shell echo 命令详解
echo 是 Linux 中最常用的命令之一,用于在终端显示文本或变量值。
基本语法
echo [选项] [字符串]
1. 显示普通字符串
echo "It is a test"
简化版本(无需引号):
echo It is a test
说明:
- 引号可以省略
- 单引号和双引号都可使用
- 建议在字符串包含特殊字符时使用引号
实际应用:
# 显示欢迎信息
echo "欢迎使用 Linux 系统"
# 显示提示信息
echo "正在处理文件,请稍候..."
2. 显示转义字符
echo "\"It is a test\""
输出结果:
"It is a test"
实际应用:
# 在脚本中显示带引号的字符串
echo "系统提示:\"文件已成功删除\""
# 显示双引号字符
echo "注意:文件名包含 \" 引号"
3. 显示变量
#!/bin/sh
read name
echo "$name It is a test"
交互式示例:
#!/bin/bash
# 读取用户输入
read -p "请输入您的姓名: " username
echo "您好,$username!欢迎使用本系统"
# 显示系统变量
echo "当前用户: $USER"
echo "当前主机名: $HOSTNAME"
echo "当前工作目录: $PWD"
echo "当前时间: $(date)"
变量类型:
| 类型 | 示例 | 说明 |
|---|---|---|
| 用户变量 | name="张三" | 用户自定义变量 |
| 系统变量 | $USER, $HOME | 系统预定义变量 |
| 环境变量 | $PATH, $LANG | 环境配置变量 |
| 命令替换 | $(date) | 执行命令获取结果 |
4. 显示换行
echo -e "OK! \n"
echo "It is a test"
输出结果:
OK!
It is a test
实际应用:
# 创建多行输出
echo -e "系统状态报告\n==================\n"
echo "CPU: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
echo "内存: $(free -h | grep Mem | awk '{print $2}')"
echo "磁盘: $(df -h / | tail -1 | awk '{print $4}')"
# 输出格式化报表
echo -e "姓名\t年龄\t城市\n----\t----\t----\n"
echo -e "张三\t25\t北京\n李四\t30\t上海"
5. 显示不换行
#!/bin/sh
echo -e "OK! \c" # -e 开启转义,\c 不换行
echo "It is a test"
输出结果:
OK! It is a test
实际应用:
# 显示进度指示器
for i in {1..10}; do
echo -e "进度: $i0%\r\c"
sleep 1
done
echo ""
# 进度条
echo -n "正在下载: ["
for i in {1..50}; do
echo -n "="
sleep 0.1
done
echo "] 完成"
6. 显示结果定向至文件
echo "It is a test" > myfile.txt
文件操作示例:
# 创建简单的日志文件
echo "$(date): 系统启动" > /var/log/boot.log
# 追加内容到文件
echo "$(date): 用户登录" >> /var/log/boot.log
# 重定向多行内容
cat << EOF > config.txt
# 配置文件
host=localhost
port=8080
debug=false
EOF
# 创建 CSV 文件
echo "姓名,年龄,城市" > users.csv
echo "张三,25,北京" >> users.csv
echo "李四,30,上海" >> users.csv
7. 原样输出字符串(使用单引号)
echo '$name"'
输出结果:
$name"
对比分析:
| 引号类型 | 示例 | 输出 | 说明 |
|---|---|---|---|
| 单引号 | echo '$var' | $var | 原样输出,不解析变量 |
| 双引号 | echo "$var" | value | 解析变量和转义字符 |
| 无引号 | echo $var | value | 按空格分割单词 |
实际应用:
# 显示代码片段
echo 'function hello() {'
echo ' echo "Hello, World!"'
echo '}'
# 显示文件路径(防止转义)
echo '文件路径: /home/user/documents/file.txt'
# 显示正则表达式
echo '正则表达式: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
8. 显示命令执行结果
echo `date`
重要说明:使用反引号(`)而非单引号(')
实际应用:
# 显示系统信息
echo "当前日期: `date +%Y-%m-%d`"
echo "当前时间: `date +%H:%M:%S`"
echo "系统负载: `uptime | awk '{print $10,$11,$12}'`"
echo "在线用户: `who | wc -l` 人"
# 显示文件信息
echo "当前目录: `pwd`"
echo "目录内容: `ls -1 | wc -l` 个文件"
echo "磁盘使用: `du -sh .`"
# 组合使用
echo "报告生成时间: `date`"
echo "系统运行时间: `uptime`"
echo "当前用户: `whoami`"
9. echo -e 控制字符参数
echo -e 启用转义字符解释:
| 控制字符 | 作用 | 示例 | 输出 |
|---|---|---|---|
\\ | 输出 \ 本身 | echo -e "\\" | \ |
\a | 输出警告音 | echo -e "警告\a" | 响铃 |
\b | 退格键 | echo -e "ab\b c" | a c |
\c | 取消行末换行 | echo -e "Hello\c" | Hello(光标保留) |
\e | Esc 键 | echo -e "\e[31m红色\e[0m" | 红色文本 |
\f | 换页符 | echo -e "第1页\f第2页" | 换页 |
\n | 换行符 | echo -e "第1行\n第2行" | 换行 |
\r | 回车键 | echo -e "123\r456" | 456 |
\t | 制表符(Tab) | echo -e "姓名\t年龄" | 制表分隔 |
\v | 垂直制表符 | echo -e "第1行\v第2行" | 垂直换行 |
\0nnn | 八进制 ASCII | echo -e "\0101" | A |
\xhh | 十六进制 ASCII | echo -e "\x41" | A |
实际应用 - 颜色输出:
#!/bin/bash
# 定义颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${RED}错误信息${NC}"
echo -e "${GREEN}成功信息${NC}"
echo -e "${YELLOW}警告信息${NC}"
echo -e "${BLUE}提示信息${NC}"
# 带背景色的输出
echo -e "\033[41;37m红底白字\033[0m"
echo -e "\033[42;30m绿底黑字\033[0m"
# 带样式的输出
BOLD='\033[1m'
UNDERLINE='\033[4m'
echo -e "${BOLD}粗体文本${NC}"
echo -e "${UNDERLINE}下划线文本${NC}"
进度条示例:
#!/bin/bash
echo -n "处理进度: ["
for i in {1..50}; do
echo -n "="
sleep 0.05
done
echo "] 100%"
Linux wc 命令详解
wc(Word Count)命令用于计算文件的行数、字数、字节数等统计信息。
基本语法
wc [选项] [文件...]
命令参数
| 参数 | 长参数 | 说明 |
|---|---|---|
-c | --bytes | 只显示字节数 |
-l | --lines | 只显示行数 |
-w | --words | 只显示单词数 |
-m | --chars | 只显示字符数 |
-L | --max-line-length | 显示最长行的长度 |
--help | --help | 显示帮助信息 |
--version | --version | 显示版本信息 |
基础使用
1. 统计文件信息
# 统计文件的行数、单词数、字节数
wc testfile
# 输出格式:行数 单词数 字节数 文件名
# 3 92 598 testfile
2. 示例文件内容
创建测试文件:
cat > testfile << 'EOF'
Linux networks are becoming more and more common, but security is often an overlooked
issue. Unfortunately, in today's environment all networks are potential hacker targets,
from top-secret military research networks to small home LANs.
Linux Network Security focuses on securing Linux in a networked environment, where the
security of the entire network needs to be considered rather than just isolated machines.
EOF
3. 统计结果说明
$ wc testfile
3 92 598 testfile
结果解释:
3:文件有 3 行92:文件有 92 个单词598:文件有 598 个字节testfile:文件名
实际应用场景
1. 按类型统计
# 只统计行数
wc -l *.txt
# 只统计单词数
wc -w *.log
# 只统计字节数
wc -c *.dat
# 只统计字符数
wc -m *.txt
# 显示最长行的长度
wc -L *.conf
2. 统计多个文件
# 同时统计多个文件
wc file1.txt file2.txt file3.txt
# 统计并显示总数
wc file1.txt file2.txt file3.txt
# 输出示例:
# 15 120 1024 file1.txt
# 30 250 2048 file2.txt
# 45 380 3072 file3.txt
# 90 750 6144 total
3. 结合其他命令使用
# 统计当前目录的文件数量
ls -1 | wc -l
# 统计文件中的代码行数(排除空行)
grep -c . file.txt
# 统计日志中的错误数量
grep -c "ERROR" /var/log/application.log
# 统计用户数量
cat /etc/passwd | wc -l
# 统计进程数量
ps aux | wc -l
# 统计特定扩展名的文件数量
find . -name "*.py" | wc -l
# 统计非空行数
grep -c "^\s*$" file.txt | awk '{print NR - $1}'
4. 监控系统使用
# 统计登录用户数
who | wc -l
# 统计网络连接数
netstat -an | grep ESTABLISHED | wc -l
# 统计磁盘文件数量
find / -type f | wc -l
# 统计系统调用次数
strace -c -p <PID> 2>&1 | tail -1
5. 代码分析
# 统计代码行数(排除空行和注释)
grep -v '^\s*$' *.c | grep -v '^\s*//' | wc -l
# 统计函数数量
grep -c '^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*(' *.c
# 统计注释行数
grep -c '^\s*//' *.c
# 统计TODO数量
grep -c 'TODO' *.py
6. 文件处理管道
# 查找最大文件
ls -l | sort -k5 -nr | head -1 | awk '{print $9, $5}'
# 统计每个用户的进程数
ps aux | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr
# 统计日志文件中每种级别的日志数量
grep -o '\[ERROR\]' /var/log/app.log | wc -l
grep -o '\[WARNING\]' /var/log/app.log | wc -l
grep -o '\[INFO\]' /var/log/app.log | wc -l
# 统计访问量最高的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10
高级用法
1. 使用通配符
# 统计所有 txt 文件
wc -l *.txt
# 递归统计
find . -type f -name "*.py" | xargs wc -l
# 统计特定目录
wc -l /var/log/*.log
2. 输出格式化
# 只显示文件名和统计结果
wc -l *.txt | awk '{print $2, $1}'
# 创建文件统计报告
echo "文件统计报告" > report.txt
echo "=================" >> report.txt
echo "Python 文件: $(find . -name '*.py' | wc -l)" >> report.txt
echo "Shell 脚本: $(find . -name '*.sh' | wc -l)" >> report.txt
echo "配置文件: $(find . -name '*.conf' | wc -l)" >> report.txt
3. 结合脚本使用
#!/bin/bash
# 统计项目代码行数
echo "代码统计报告"
echo "============="
echo ""
for ext in py js java cpp c h; do
count=$(find . -name "*.${ext}" -type f | xargs cat | wc -l)
echo "${ext} 文件: $count 行"
done
echo ""
echo "总计: $(find . -type f \( -name '*.py' -o -name '*.js' -o -name '*.java' \) | xargs cat | wc -l) 行"
性能监控示例
#!/bin/bash
# 系统状态监控脚本
echo "系统状态报告"
echo "============="
echo "时间: $(date)"
echo ""
echo "CPU 使用率: $(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d'%' -f1)%"
echo "内存使用: $(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
echo "磁盘使用: $(df -h / | awk 'NR==2{print $5}')"
echo ""
echo "进程统计:"
echo "总进程数: $(ps aux | wc -l)"
echo "运行进程: $(ps aux | grep -c ' R ')"
echo "睡眠进程: $(ps aux | grep -c ' S ')"
echo ""
echo "网络统计:"
echo "网络接口: $(ip addr | grep -c 'state UP')"
echo "TCP 连接: $(netstat -an | grep -c '^tcp')"
echo "UDP 连接: $(netstat -an | grep -c '^udp')"
故障排除
常见问题
1. 多字节字符统计不准确
# 错误示例:中文会被计算为多个字节
echo "中文测试" | wc -c
# 输出:11(每个中文字符占 3 字节)
# 正确做法:使用 -m 参数统计字符数
echo "中文测试" | wc -m
# 输出:5(实际字符数)
2. 文件包含空行
# 统计所有行(包括空行)
wc -l file.txt
# 统计非空行
grep -c . file.txt
# 统计有效内容行
grep -v '^\s*$' file.txt | wc -l
3. 特殊文件处理
# 处理包含特殊字符的文件
wc -l "file with spaces.txt"
# 处理二进制文件
file binary_file
wc -l <(strings binary_file | grep text_pattern)
最佳实践
1. echo 命令最佳实践
- 使用引号:在字符串包含特殊字符时使用引号
- 选择引号类型:根据是否需要变量解析选择单引号或双引号
- 使用 -e 参数:处理转义字符时开启转义解释
- 避免过度使用:在脚本中合理使用 echo 输出信息
2. wc 命令最佳实践
- 指定参数:根据需求使用
-l、-w、-c等参数 - 组合使用:与其他命令(sort、grep、find)组合使用
- 处理多文件:使用通配符批量处理多个文件
- 格式化输出:结合 awk、sed 格式化输出结果
3. 性能考虑
# 大量文件统计
find . -type f -name "*.log" -exec wc -l {} \; | awk '{sum+=$1} END {print "总计:", sum}'
# 并行处理(使用 xargs)
ls *.txt | xargs -P 4 wc -l
# 内存优化(处理大文件)
split -l 1000 largefile small_
ls small_* | xargs wc -l
rm small_*
常见错误及解决方案
错误 1:变量未展开
# 错误
echo '用户名: $USER'
# 正确
echo "用户名: $USER"
错误 2:特殊字符未转义
# 错误
echo "文件路径: /path/to/file"
# 正确
echo "文件路径: /path/to/file"
# 或
echo '文件路径: /path/to/file'
错误 3:多文件统计时忽略总数
# 错误:只看到各文件统计,忽略总数
wc *.txt
# 正确:注意最后的 total 行
wc *.txt | tail -1
总结
echo 和 wc 是 Linux 系统中非常实用的两个命令:
echo 命令:
- 显示文本和变量值
- 支持多种输出格式(换行、不换行、文件重定向)
- 支持转义字符和颜色输出
- 在脚本中用于信息输出和日志记录
wc 命令:
- 统计文件的行数、单词数、字节数
- 支持多种统计选项(行、词、字符、字节)
- 可与管道和重定向结合使用
- 在系统监控和代码分析中发挥重要作用
掌握这两个命令将大大提高您在 Linux 命令行下的工作效率。
进阶学习
相关命令
| 命令 | 功能 | 使用场景 |
|---|---|---|
printf | 格式化输出 | 更精细的输出控制 |
cat | 查看文件内容 | 显示文件全部内容 |
head | 显示文件开头 | 查看文件前 N 行 |
tail | 显示文件结尾 | 查看文件后 N 行 |
sort | 排序 | 文本排序 |
uniq | 去重 | 删除重复行 |
grep | 搜索 | 文本搜索过滤 |
下一步
在下一部分中,我们将介绍更多常用的 Linux 命令,包括:
- 文件操作命令:
ls、cp、mv、rm - 文本查看命令:
cat、less、more - 文本处理命令:
cut、sort、uniq - 搜索命令:
find、grep、which
持续练习这些命令,您将能够更加熟练地使用 Linux 命令行进行各种操作。