Skip to main content

常用 Linux 命令指南(一)- Shell 基础与文本处理

Linux 命令行是系统管理和开发的基础技能。本指南将详细介绍 Linux 系统中两个非常重要的命令:echowc,并提供实际应用场景和最佳实践。

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 $varvalue按空格分割单词

实际应用

# 显示代码片段
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(光标保留)
\eEsc 键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八进制 ASCIIecho -e "\0101"A
\xhh十六进制 ASCIIecho -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

总结

echowc 是 Linux 系统中非常实用的两个命令:

echo 命令

  • 显示文本和变量值
  • 支持多种输出格式(换行、不换行、文件重定向)
  • 支持转义字符和颜色输出
  • 在脚本中用于信息输出和日志记录

wc 命令

  • 统计文件的行数、单词数、字节数
  • 支持多种统计选项(行、词、字符、字节)
  • 可与管道和重定向结合使用
  • 在系统监控和代码分析中发挥重要作用

掌握这两个命令将大大提高您在 Linux 命令行下的工作效率。

进阶学习

相关命令

命令功能使用场景
printf格式化输出更精细的输出控制
cat查看文件内容显示文件全部内容
head显示文件开头查看文件前 N 行
tail显示文件结尾查看文件后 N 行
sort排序文本排序
uniq去重删除重复行
grep搜索文本搜索过滤

下一步

在下一部分中,我们将介绍更多常用的 Linux 命令,包括:

  • 文件操作命令:lscpmvrm
  • 文本查看命令:catlessmore
  • 文本处理命令:cutsortuniq
  • 搜索命令:findgrepwhich

持续练习这些命令,您将能够更加熟练地使用 Linux 命令行进行各种操作。