【Linux命令大全】003.文档编辑之comm命令(实操篇)

【Linux命令大全】003.文档编辑之comm命令(实操篇)

✨ 本文为Linux系统文档编辑与文本处理命令的全面汇总与深度优化,结合图标、结构化排版与实用技巧,专为高级用户和系统管理员打造。

(关注不迷路哈!!!)

文章目录

  • 【Linux命令大全】003.文档编辑之comm命令(实操篇)
    • 一、功能与作用
    • 二、基本用法
      • [1. 基本文件比较](#1. 基本文件比较)
      • [2. 隐藏特定列](#2. 隐藏特定列)
      • [3. 比较前先排序](#3. 比较前先排序)
      • [4. 与其他命令结合使用](#4. 与其他命令结合使用)
      • [5. 使用自定义分隔符](#5. 使用自定义分隔符)
      • [6. 检查文件排序](#6. 检查文件排序)
      • [7. 显示总行数统计](#7. 显示总行数统计)
    • 三、高级用法
      • [1. 批量比较多个文件对](#1. 批量比较多个文件对)
      • [2. 递归比较目录](#2. 递归比较目录)
      • [3. 生成差异报告](#3. 生成差异报告)
      • [4. 结合awk进行高级比较](#4. 结合awk进行高级比较)
      • [5. 监控文件变化](#5. 监控文件变化)
    • 四、实际应用场景
      • [1. 配置文件比较](#1. 配置文件比较)
      • [2. 用户和组管理](#2. 用户和组管理)
      • [3. 数据同步与合并](#3. 数据同步与合并)
      • [4. 软件包管理](#4. 软件包管理)
    • 五、注意事项与最佳实践
      • [1. 命令安装](#1. 命令安装)
      • [2. 输入文件排序要求](#2. 输入文件排序要求)
      • [3. 空行和空白字符处理](#3. 空行和空白字符处理)
      • [4. 大文件处理](#4. 大文件处理)
      • [5. 与diff命令的区别](#5. 与diff命令的区别)
      • [6. 使用进程替换](#6. 使用进程替换)
      • [7. 脚本中的错误处理](#7. 脚本中的错误处理)
    • 六、常见错误与解决方案
      • [1. 命令未找到](#1. 命令未找到)
      • [2. 比较结果不正确](#2. 比较结果不正确)
      • [3. 输出格式问题](#3. 输出格式问题)
      • [4. 输入文件权限问题](#4. 输入文件权限问题)
      • [5. 内存或资源不足](#5. 内存或资源不足)
      • [6. 特殊字符问题](#6. 特殊字符问题)
      • [7. 性能问题](#7. 性能问题)
    • 七、总结

一、功能与作用

comm命令是一个文件比较工具 ,用于逐行比较两个已排序的文本文件。它能够找出两个文件中共同存在的行、只在第一个文件中存在的行以及只在第二个文件中存在的行。comm命令在Linux系统中常用于文本分析、数据比较和差异检测等任务,是系统管理和开发工作中的重要工具。

参数详解

参数 说明
-1 不显示只在第一个文件中出现的行
-2 不显示只在第二个文件中出现的行
-3 不显示在两个文件中都出现的行
--check-order 检查输入文件是否正确排序,如有乱序则警告
--nocheck-order 不检查输入文件是否排序(默认行为)
--output-delimiter=STR 使用指定的字符串作为输出分隔符
--total 在输出末尾显示总行数统计

二、基本用法

1. 基本文件比较

最基本的comm命令用法是比较两个已排序的文件,并显示三列输出:

bash 复制代码
# 比较两个已排序的文件
comm file1.txt file2.txt

# 直接查看比较结果
comm file1.txt file2.txt | less

输出格式为三列:

  • 第一列:只在file1.txt中出现的行
  • 第二列:只在file2.txt中出现的行
  • 第三列:在两个文件中都出现的行

2. 隐藏特定列

使用-1-2-3参数可以隐藏特定的列:

bash 复制代码
# 只显示两个文件中共同存在的行(隐藏第一列和第二列)
comm -12 file1.txt file2.txt

# 只显示只在第一个文件中存在的行(隐藏第二列和第三列)
comm -23 file1.txt file2.txt

# 只显示只在第二个文件中存在的行(隐藏第一列和第三列)
comm -13 file1.txt file2.txt

# 显示只在第一个文件或只在第二个文件中存在的行(隐藏第三列)
comm -3 file1.txt file2.txt

3. 比较前先排序

如果文件未排序,可以先使用sort命令排序,然后再进行比较:

bash 复制代码
# 先排序文件,然后比较
sort file1.txt > file1_sorted.txt
sort file2.txt > file2_sorted.txt
comm file1_sorted.txt file2_sorted.txt

# 使用管道一步完成排序和比较
sort file1.txt > file1_sorted.txt
sort file2.txt | comm file1_sorted.txt -

# 完全使用管道,不创建临时文件
comm <(sort file1.txt) <(sort file2.txt)

4. 与其他命令结合使用

comm命令可以与其他Linux命令结合使用,实现更复杂的文本处理功能:

bash 复制代码
# 比较两个文件,然后将结果保存到文件
comm file1.txt file2.txt > comparison_result.txt

# 比较两个文件,并过滤出包含特定字符串的行
comm file1.txt file2.txt | grep "pattern"

# 比较两个文件,并计算各部分的行数
comm -12 file1.txt file2.txt | wc -l  # 共同行的数量
comm -23 file1.txt file2.txt | wc -l  # 只在第一个文件中存在的行的数量
comm -13 file1.txt file2.txt | wc -l  # 只在第二个文件中存在的行的数量

5. 使用自定义分隔符

使用--output-delimiter参数可以指定输出分隔符,默认为Tab键:

bash 复制代码
# 使用逗号作为输出分隔符
comm --output-delimiter="," file1.txt file2.txt

# 使用空格作为输出分隔符
comm --output-delimiter=" " file1.txt file2.txt

# 使用多个字符作为输出分隔符
comm --output-delimiter=" | " file1.txt file2.txt

6. 检查文件排序

使用--check-order参数可以检查输入文件是否正确排序,如有乱序则警告:

bash 复制代码
# 检查文件是否正确排序,并比较
comm --check-order file1.txt file2.txt

# 强制不检查文件排序(默认行为)
comm --nocheck-order file1.txt file2.txt

7. 显示总行数统计

使用--total参数可以在输出末尾显示总行数统计:

bash 复制代码
# 比较文件并显示总行数统计
comm --total file1.txt file2.txt

# 结合其他参数使用
comm -12 --total file1.txt file2.txt

三、高级用法

1. 批量比较多个文件对

对于需要比较多个文件对的情况,可以编写一个简单的脚本来批量使用comm命令:

bash 复制代码
#!/bin/bash
# 批量比较多个文件对的comm命令脚本

# 设置变量
DIR1="dir1"
DIR2="dir2"
OUTPUT_DIR="comparison_results"

# 创建输出目录(如果不存在)
mkdir -p $OUTPUT_DIR

# 遍历第一个目录中的所有文件
for file1 in $DIR1/*.txt; do
  # 获取文件名
  filename=$(basename "$file1")
  file2="$DIR2/$filename"
  
  # 检查第二个目录中是否存在对应的文件
  if [ -f "$file2" ]; then
    echo "Comparing $filename..."
    
    # 排序文件
    sort "$file1" > "$OUTPUT_DIR/${filename}_sorted1"
    sort "$file2" > "$OUTPUT_DIR/${filename}_sorted2"
    
    # 执行比较并保存结果
    comm "$OUTPUT_DIR/${filename}_sorted1" "$OUTPUT_DIR/${filename}_sorted2" > "$OUTPUT_DIR/${filename}_comparison"
    
    # 计算各部分的行数
    common_lines=$(comm -12 "$OUTPUT_DIR/${filename}_sorted1" "$OUTPUT_DIR/${filename}_sorted2" | wc -l)
    only_in1=$(comm -23 "$OUTPUT_DIR/${filename}_sorted1" "$OUTPUT_DIR/${filename}_sorted2" | wc -l)
    only_in2=$(comm -13 "$OUTPUT_DIR/${filename}_sorted1" "$OUTPUT_DIR/${filename}_sorted2" | wc -l)
    
    # 添加统计信息到结果文件
    echo -e "\n=== Statistics ===" >> "$OUTPUT_DIR/${filename}_comparison"
    echo "Common lines: $common_lines" >> "$OUTPUT_DIR/${filename}_comparison"
    echo "Only in $DIR1: $only_in1" >> "$OUTPUT_DIR/${filename}_comparison"
    echo "Only in $DIR2: $only_in2" >> "$OUTPUT_DIR/${filename}_comparison"
  else
    echo "Warning: $file2 does not exist! Skipping..."
  fidone

# 清理临时文件
rm "$OUTPUT_DIR"/*_sorted1 "$OUTPUT_DIR"/*_sorted2 2>/dev/null

# 显示完成信息
echo "All file pairs processed successfully!"
echo "Comparison results are in $OUTPUT_DIR"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x batch_comm.sh

# 执行脚本比较两个目录中的文件
./batch_comm.sh

2. 递归比较目录

可以编写一个脚本,递归比较两个目录中的所有文件:

bash 复制代码
#!/bin/bash
# 递归比较目录的脚本

# 设置变量
DIR1="$1"
DIR2="$2"
LOG_FILE="directory_comparison.log"

# 检查输入参数
if [ -z "$DIR1" ] || [ -z "$DIR2" ]; then
  echo "Usage: $0 directory1 directory2"
  exit 1
fi

# 检查目录是否存在
if [ ! -d "$DIR1" ]; then
  echo "Error: Directory $DIR1 not found!"
  exit 1
fi

if [ ! -d "$DIR2" ]; then
  echo "Error: Directory $DIR2 not found!"
  exit 1
fi

# 初始化日志文件
echo "[$(date)] Starting directory comparison: $DIR1 vs $DIR2" > $LOG_FILE

# 收集两个目录中的所有文件路径
find "$DIR1" -type f -name "*.txt" | sort > "${LOG_FILE}_dir1_files"
find "$DIR2" -type f -name "*.txt" | sort > "${LOG_FILE}_dir2_files"

# 比较文件列表
echo "Comparing file lists..."
comm -23 "${LOG_FILE}_dir1_files" "${LOG_FILE}_dir2_files" > "${LOG_FILE}_only_in_dir1"
comm -13 "${LOG_FILE}_dir1_files" "${LOG_FILE}_dir2_files" > "${LOG_FILE}_only_in_dir2"
comm -12 "${LOG_FILE}_dir1_files" "${LOG_FILE}_dir2_files" > "${LOG_FILE}_common_files"

# 记录文件列表比较结果
echo -e "\n=== File List Comparison ===" >> $LOG_FILE
if [ -s "${LOG_FILE}_only_in_dir1" ]; then
  echo "Files only in $DIR1: $(wc -l < "${LOG_FILE}_only_in_dir1")" >> $LOG_FILE
  cat "${LOG_FILE}_only_in_dir1" >> $LOG_FILE
else
  echo "No files only in $DIR1" >> $LOG_FILE
fi

if [ -s "${LOG_FILE}_only_in_dir2" ]; then
  echo "Files only in $DIR2: $(wc -l < "${LOG_FILE}_only_in_dir2")" >> $LOG_FILE
  cat "${LOG_FILE}_only_in_dir2" >> $LOG_FILE
else
  echo "No files only in $DIR2" >> $LOG_FILE
fi

if [ -s "${LOG_FILE}_common_files" ]; then
  echo "Common files: $(wc -l < "${LOG_FILE}_common_files")" >> $LOG_FILE
  
  # 比较共同的文件
  echo -e "\n=== Comparing Common Files ===" >> $LOG_FILE
  while read common_file; do
    # 获取相对于DIR1的路径
    rel_path=$(echo "$common_file" | sed "s|^$DIR1||")
    file1="$common_file"
    file2="$DIR2$rel_path"
    
    echo "Comparing $rel_path..." >> $LOG_FILE
    
    # 排序文件并比较
    sort "$file1" > "${LOG_FILE}_sorted1"
    sort "$file2" > "${LOG_FILE}_sorted2"
    
    # 计算差异
    common_lines=$(comm -12 "${LOG_FILE}_sorted1" "${LOG_FILE}_sorted2" | wc -l)
    only_in1=$(comm -23 "${LOG_FILE}_sorted1" "${LOG_FILE}_sorted2" | wc -l)
    only_in2=$(comm -13 "${LOG_FILE}_sorted1" "${LOG_FILE}_sorted2" | wc -l)
    
    # 记录差异
    if [ $only_in1 -eq 0 ] && [ $only_in2 -eq 0 ]; then
      echo "  $rel_path: Files are identical" >> $LOG_FILE
    else
      echo "  $rel_path: Files differ" >> $LOG_FILE
      echo "    Common lines: $common_lines" >> $LOG_FILE
      echo "    Only in $DIR1: $only_in1" >> $LOG_FILE
      echo "    Only in $DIR2: $only_in2" >> $LOG_FILE
    fidone < "${LOG_FILE}_common_files"
else
  echo "No common files found" >> $LOG_FILE
fi

# 清理临时文件
rm "${LOG_FILE}_dir1_files" "${LOG_FILE}_dir2_files" "${LOG_FILE}_only_in_dir1" "${LOG_FILE}_only_in_dir2" "${LOG_FILE}_common_files" "${LOG_FILE}_sorted1" "${LOG_FILE}_sorted2" 2>/dev/null

# 显示完成信息
echo "[$(date)] Directory comparison completed" >> $LOG_FILE
echo "Directory comparison finished!"
echo "Log file: $LOG_FILE"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x recursive_directory_compare.sh

# 递归比较两个目录
./recursive_directory_compare.sh dir1 dir2

3. 生成差异报告

可以使用comm命令生成详细的差异报告,包括共同内容和差异内容:

bash 复制代码
#!/bin/bash
# 生成差异报告的脚本

# 设置变量
FILE1="$1"
FILE2="$2"
REPORT_DATE=$(date +%Y%m%d_%H%M%S)
REPORT_FILE="comparison_report_${REPORT_DATE}.txt"

# 检查输入参数
if [ -z "$FILE1" ] || [ -z "$FILE2" ]; then
  echo "Usage: $0 file1.txt file2.txt"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$FILE1" ]; then
  echo "Error: File $FILE1 not found!"
  exit 1
fi

if [ ! -f "$FILE2" ]; then
  echo "Error: File $FILE2 not found!"
  exit 1
fi

# 创建报告头部
echo "===========================================================" > "$REPORT_FILE"
echo "                      FILE COMPARISON REPORT                 " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "Report generated on: $(date)" >> "$REPORT_FILE"
echo "File 1: $FILE1" >> "$REPORT_FILE"
echo "File 2: $FILE2" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 排序文件
TMP1=$(mktemp)
TMP2=$(mktemp)
sort "$FILE1" > "$TMP1"
sort "$FILE2" > "$TMP2"

# 计算统计信息
TOTAL1=$(wc -l < "$TMP1")
TOTAL2=$(wc -l < "$TMP2")
COMMON=$(comm -12 "$TMP1" "$TMP2" | wc -l)
ONLY_IN1=$(comm -23 "$TMP1" "$TMP2" | wc -l)
ONLY_IN2=$(comm -13 "$TMP1" "$TMP2" | wc -l)

# 添加统计信息
echo "===========================================================" >> "$REPORT_FILE"
echo "                        STATISTICS                          " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
echo "Total lines in $FILE1: $TOTAL1" >> "$REPORT_FILE"
echo "Total lines in $FILE2: $TOTAL2" >> "$REPORT_FILE"
echo "Common lines: $COMMON" >> "$REPORT_FILE"
echo "Lines only in $FILE1: $ONLY_IN1" >> "$REPORT_FILE"
echo "Lines only in $FILE2: $ONLY_IN2" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 添加详细比较结果
echo "===========================================================" >> "$REPORT_FILE"
echo "                      DETAILED COMPARISON                    " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"

# 添加共同行
echo -e "\n=== COMMON LINES ($COMMON) ===" >> "$REPORT_FILE"
if [ $COMMON -gt 0 ]; then
  comm -12 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No common lines found" >> "$REPORT_FILE"
fi

# 添加只在第一个文件中存在的行
echo -e "\n=== LINES ONLY IN $FILE1 ($ONLY_IN1) ===" >> "$REPORT_FILE"
if [ $ONLY_IN1 -gt 0 ]; then
  comm -23 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No lines found only in $FILE1" >> "$REPORT_FILE"
fi

# 添加只在第二个文件中存在的行
echo -e "\n=== LINES ONLY IN $FILE2 ($ONLY_IN2) ===" >> "$REPORT_FILE"
if [ $ONLY_IN2 -gt 0 ]; then
  comm -13 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No lines found only in $FILE2" >> "$REPORT_FILE"
fi

# 清理临时文件
rm "$TMP1" "$TMP2"

# 显示完成信息
echo "Comparison report generated!"
echo "Report file: $REPORT_FILE"
echo "Total report size: $(wc -c < $REPORT_FILE) bytes"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x generate_comparison_report.sh

# 生成差异报告
./generate_comparison_report.sh file1.txt file2.txt

4. 结合awk进行高级比较

comm命令可以与awk命令结合使用,实现更复杂的比较逻辑:

bash 复制代码
#!/bin/bash
# 结合awk进行高级比较的脚本

# 设置变量
FILE1="$1"
FILE2="$2"
OUTPUT_FILE="advanced_comparison.txt"

# 检查输入参数
if [ -z "$FILE1" ] || [ -z "$FILE2" ]; then
  echo "Usage: $0 file1.txt file2.txt"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$FILE1" ]; then
  echo "Error: File $FILE1 not found!"
  exit 1
fi

if [ ! -f "$FILE2" ]; then
  echo "Error: File $FILE2 not found!"
  exit 1
fi

# 排序文件
TMP1=$(mktemp)
TMP2=$(mktemp)
sort "$FILE1" > "$TMP1"
sort "$FILE2" > "$TMP2"

# 使用comm和awk进行高级比较
echo "Performing advanced comparison..."

# 1. 比较文件
# 2. 使用awk添加前缀并进行额外处理
# 3. 保存结果

comm "$TMP1" "$TMP2" | awk '
  BEGIN { 
    print "============================================================";
    print "                    ADVANCED FILE COMPARISON                  ";
    print "============================================================";
    common = 0; only_in1 = 0; only_in2 = 0;
  }
  
  # 只在第一个文件中存在的行
  /^\s*\S/ { 
    gsub(/^\s+/, ""); 
    print "[ONLY IN FILE1] " $0; 
    only_in1++;
  }
  
  # 只在第二个文件中存在的行
  /^\t\s*\S/ { 
    gsub(/^\t\s*/, ""); 
    print "[ONLY IN FILE2] " $0; 
    only_in2++;
  }
  
  # 在两个文件中都存在的行
  /^\t\t/ { 
    gsub(/^\t\t/, ""); 
    print "[COMMON] " $0; 
    common++;
  }
  
  END { 
    print "============================================================";
    print "SUMMARY: Common lines: " common ", Only in file1: " only_in1 ", Only in file2: " only_in2;
    print "============================================================";
  }
' > "$OUTPUT_FILE"

# 清理临时文件
rm "$TMP1" "$TMP2"

# 显示完成信息
echo "Advanced comparison completed!"
echo "Output file: $OUTPUT_FILE"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x advanced_comparison.sh

# 执行高级比较
./advanced_comparison.sh file1.txt file2.txt

5. 监控文件变化

可以使用comm命令创建一个监控文件变化的脚本:

bash 复制代码
#!/bin/bash
# 监控文件变化的脚本

# 设置变量
SOURCE_FILE="$1"
BACKUP_FILE="${SOURCE_FILE}.bak"
DIFF_FILE="${SOURCE_FILE}.diff"
SLEEP_INTERVAL=60  # 监控间隔(秒)

# 检查输入参数
if [ -z "$SOURCE_FILE" ]; then
  echo "Usage: $0 file_to_monitor.txt"
  echo "Press Ctrl+C to stop monitoring."
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$SOURCE_FILE" ]; then
  echo "Error: File $SOURCE_FILE not found!"
  exit 1
fi

# 创建初始备份
cp "$SOURCE_FILE" "$BACKUP_FILE"

# 显示开始信息
echo "Starting file monitoring for $SOURCE_FILE..."
echo "Monitoring interval: $SLEEP_INTERVAL seconds"
echo "Press Ctrl+C to stop."

# 监控循环
while true; do
  # 等待一段时间
  sleep $SLEEP_INTERVAL
  
  # 检查文件是否存在
  if [ ! -f "$SOURCE_FILE" ]; then
    echo "[$(date)] ERROR: File $SOURCE_FILE no longer exists!"
    exit 1
  fi
  
  # 排序文件并比较
  TMP1=$(mktemp)
  TMP2=$(mktemp)
  sort "$SOURCE_FILE" > "$TMP1"
  sort "$BACKUP_FILE" > "$TMP2"
  
  # 检查是否有变化
  CHANGES=$(comm -3 "$TMP1" "$TMP2" | wc -l)
  
  if [ $CHANGES -ne 0 ]; then
    # 记录变化
    echo "[$(date)] Changes detected in $SOURCE_FILE!" | tee -a "$DIFF_FILE"
    comm -3 "$TMP1" "$TMP2" | tee -a "$DIFF_FILE"
    echo "-------------------------------------------------------" | tee -a "$DIFF_FILE"
    
    # 更新备份
    cp "$SOURCE_FILE" "$BACKUP_FILE"
    
    # 可以添加通知命令,如发送邮件或推送通知
    # echo "File $SOURCE_FILE has changed!" | mail -s "File Change Alert" user@example.com
  fi
  
  # 清理临时文件
  rm "$TMP1" "$TMP2"
done

使用示例:

bash 复制代码
# 授予执行权限
chmod +x monitor_file_changes.sh

# 开始监控文件变化
./monitor_file_changes.sh config_file.txt

四、实际应用场景

1. 配置文件比较

在系统管理中,comm命令常用于比较不同版本的配置文件,找出差异:

bash 复制代码
#!/bin/bash
# 配置文件比较脚本

# 设置变量
CONFIG1="$1"
CONFIG2="$2"
REPORT_FILE="config_comparison.txt"

# 检查输入参数
if [ -z "$CONFIG1" ] || [ -z "$CONFIG2" ]; then
  echo "Usage: $0 config_file1 config_file2"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$CONFIG1" ]; then
  echo "Error: Config file $CONFIG1 not found!"
  exit 1
fi

if [ ! -f "$CONFIG2" ]; then
  echo "Error: Config file $CONFIG2 not found!"
  exit 1
fi

# 创建报告头部
echo "===========================================================" > "$REPORT_FILE"
echo "                     CONFIGURATION COMPARISON                " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"
echo "Date: $(date)" >> "$REPORT_FILE"
echo "Config 1: $CONFIG1" >> "$REPORT_FILE"
echo "Config 2: $CONFIG2" >> "$REPORT_FILE"
echo "" >> "$REPORT_FILE"

# 过滤掉注释行和空白行,然后排序
TMP1=$(mktemp)
TMP2=$(mktemp)
sed '/^#/d;/^\s*$/d;s/[[:blank:]]*=[[:blank:]]*/=/g' "$CONFIG1" | sort > "$TMP1"
sed '/^#/d;/^\s*$/d;s/[[:blank:]]*=[[:blank:]]*/=/g' "$CONFIG2" | sort > "$TMP2"

# 比较配置并添加到报告

# 添加只在第一个配置文件中存在的设置
echo "===========================================================" >> "$REPORT_FILE"
echo "               SETTINGS ONLY IN $CONFIG1                     " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
if comm -23 "$TMP1" "$TMP2" | grep -q .; then
  comm -23 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No unique settings in $CONFIG1" >> "$REPORT_FILE"
fi

# 添加只在第二个配置文件中存在的设置
echo -e "\n===========================================================" >> "$REPORT_FILE"
echo "               SETTINGS ONLY IN $CONFIG2                     " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
if comm -13 "$TMP1" "$TMP2" | grep -q .; then
  comm -13 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No unique settings in $CONFIG2" >> "$REPORT_FILE"
fi

# 添加共同的设置
echo -e "\n===========================================================" >> "$REPORT_FILE"
echo "                    COMMON SETTINGS                          " >> "$REPORT_FILE"
echo "===========================================================" >> "$REPORT_FILE"
if comm -12 "$TMP1" "$TMP2" | grep -q .; then
  comm -12 "$TMP1" "$TMP2" >> "$REPORT_FILE"
else
  echo "No common settings found" >> "$REPORT_FILE"
fi

# 清理临时文件
rm "$TMP1" "$TMP2"

# 显示完成信息
echo "Configuration comparison completed!"
echo "Report file: $REPORT_FILE"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x compare_configs.sh

# 比较两个配置文件
./compare_configs.sh /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

2. 用户和组管理

comm命令可以用于比较用户列表和组列表,帮助系统管理员进行用户和组管理:

bash 复制代码
#!/bin/bash
# 用户和组管理脚本

# 设置变量
OUTPUT_DIR="user_group_reports"
REPORT_DATE=$(date +%Y%m%d)

# 创建输出目录
mkdir -p $OUTPUT_DIR

# 获取当前用户和组信息
echo "Collecting user and group information..."
cut -d: -f1 /etc/passwd | sort > "$OUTPUT_DIR/users_current.txt"
cut -d: -f1 /etc/group | sort > "$OUTPUT_DIR/groups_current.txt"

# 比较与上次备份的差异(如果存在)
if [ -f "$OUTPUT_DIR/users_prev.txt" ] && [ -f "$OUTPUT_DIR/groups_prev.txt" ]; then
  echo "Comparing with previous data..."
  
  # 比较用户列表
  comm -23 "$OUTPUT_DIR/users_current.txt" "$OUTPUT_DIR/users_prev.txt" > "$OUTPUT_DIR/users_added_${REPORT_DATE}.txt"
  comm -13 "$OUTPUT_DIR/users_current.txt" "$OUTPUT_DIR/users_prev.txt" > "$OUTPUT_DIR/users_removed_${REPORT_DATE}.txt"
  
  # 比较组列表
  comm -23 "$OUTPUT_DIR/groups_current.txt" "$OUTPUT_DIR/groups_prev.txt" > "$OUTPUT_DIR/groups_added_${REPORT_DATE}.txt"
  comm -13 "$OUTPUT_DIR/groups_current.txt" "$OUTPUT_DIR/groups_prev.txt" > "$OUTPUT_DIR/groups_removed_${REPORT_DATE}.txt"
  
  # 生成报告
  echo "Generating user and group change report..."
  echo "===========================================================" > "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  echo "                     USER AND GROUP CHANGES                  " >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  echo "                     Report Date: $REPORT_DATE                " >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  echo "===========================================================" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  echo -e "\n=== Users Added ===" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  if [ -s "$OUTPUT_DIR/users_added_${REPORT_DATE}.txt" ]; then
    cat "$OUTPUT_DIR/users_added_${REPORT_DATE}.txt" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  else
    echo "No new users added" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  fi
  echo -e "\n=== Users Removed ===" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  if [ -s "$OUTPUT_DIR/users_removed_${REPORT_DATE}.txt" ]; then
    cat "$OUTPUT_DIR/users_removed_${REPORT_DATE}.txt" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  else
    echo "No users removed" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  fi
  echo -e "\n=== Groups Added ===" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  if [ -s "$OUTPUT_DIR/groups_added_${REPORT_DATE}.txt" ]; then
    cat "$OUTPUT_DIR/groups_added_${REPORT_DATE}.txt" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  else
    echo "No new groups added" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  fi
  echo -e "\n=== Groups Removed ===" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  if [ -s "$OUTPUT_DIR/groups_removed_${REPORT_DATE}.txt" ]; then
    cat "$OUTPUT_DIR/groups_removed_${REPORT_DATE}.txt" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  else
    echo "No groups removed" >> "$OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
  fi
  echo "\nReport generated successfully!""
  echo "Report file: $OUTPUT_DIR/user_group_changes_${REPORT_DATE}.txt"
fi

# 更新备份
cp "$OUTPUT_DIR/users_current.txt" "$OUTPUT_DIR/users_prev.txt"
cp "$OUTPUT_DIR/groups_current.txt" "$OUTPUT_DIR/groups_prev.txt"

# 显示完成信息
echo "User and group management tasks completed!"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x user_group_management.sh

# 以root权限执行(需要访问/etc/passwd和/etc/group)
sudo ./user_group_management.sh

3. 数据同步与合并

comm命令可以用于数据同步与合并操作,特别是在处理大型数据集时:

bash 复制代码
#!/bin/bash
# 数据同步与合并脚本

# 设置变量
SOURCE_FILE="$1"
TARGET_FILE="$2"
BACKUP_FILE="${TARGET_FILE}.bak"

# 检查输入参数
if [ -z "$SOURCE_FILE" ] || [ -z "$TARGET_FILE" ]; then
  echo "Usage: $0 source_file.txt target_file.txt"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$SOURCE_FILE" ]; then
  echo "Error: Source file $SOURCE_FILE not found!"
  exit 1
fi

if [ ! -f "$TARGET_FILE" ]; then
  echo "Warning: Target file $TARGET_FILE not found. Creating a new one."
  touch "$TARGET_FILE"
fi

# 创建目标文件的备份
cp "$TARGET_FILE" "$BACKUP_FILE"

# 排序文件
TMP1=$(mktemp)
TMP2=$(mktemp)
sort "$SOURCE_FILE" > "$TMP1"
sort "$TARGET_FILE" > "$TMP2"

# 找出只在源文件中存在的行(需要添加到目标文件的行)
NEW_LINES_FILE=$(mktemp)
comm -23 "$TMP1" "$TMP2" > "$NEW_LINES_FILE"

# 计算需要添加的行数
NEW_COUNT=$(wc -l < "$NEW_LINES_FILE")

if [ $NEW_COUNT -gt 0 ]; then
  echo "Found $NEW_COUNT new lines to add to $TARGET_FILE"
  
  # 合并文件:目标文件内容 + 新内容,然后排序去重
  cat "$TARGET_FILE" "$NEW_LINES_FILE" | sort -u > "$TARGET_FILE.tmp"
  mv "$TARGET_FILE.tmp" "$TARGET_FILE"
  
  echo "Successfully synchronized data! Added $NEW_COUNT lines."
  echo "Backup of target file saved to: $BACKUP_FILE"
else
  echo "No new lines to add. Files are already synchronized."
  rm "$BACKUP_FILE"  # 删除不必要的备份
fi

# 清理临时文件
rm "$TMP1" "$TMP2" "$NEW_LINES_FILE"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x data_sync_merge.sh

# 同步源文件和目标文件
data_sync_merge.sh new_data.txt existing_data.txt

4. 软件包管理

comm命令可以用于管理软件包列表,比较已安装的软件包和推荐的软件包:

bash 复制代码
#!/bin/bash
# 软件包管理脚本

# 设置变量
RECOMMENDED_PACKAGES="$1"
OUTPUT_DIR="package_reports"
REPORT_DATE=$(date +%Y%m%d)

# 检查输入参数
if [ -z "$RECOMMENDED_PACKAGES" ]; then
  echo "Usage: $0 recommended_packages.txt"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$RECOMMENDED_PACKAGES" ]; then
  echo "Error: Recommended packages file $RECOMMENDED_PACKAGES not found!"
  exit 1
fi

# 创建输出目录
mkdir -p $OUTPUT_DIR

# 获取已安装的软件包列表
echo "Collecting installed packages..."
if command -v dpkg &> /dev/null; then
  # Debian/Ubuntu系统
  dpkg --get-selections | grep -v deinstall | cut -f1 | sort > "$OUTPUT_DIR/installed_packages.txt"
elif command -v rpm &> /dev/null; then
  # CentOS/RHEL系统
  rpm -qa --qf "%{NAME}\n" | sort > "$OUTPUT_DIR/installed_packages.txt"
elif command -v pacman &> /dev/null; then
  # Arch Linux系统
  pacman -Qq | sort > "$OUTPUT_DIR/installed_packages.txt"
else
  echo "Error: Unsupported package manager. Could not determine installed packages."
  exit 1
fi

# 排序推荐的软件包列表
sort "$RECOMMENDED_PACKAGES" > "$OUTPUT_DIR/recommended_packages_sorted.txt"

# 比较软件包列表
comm -12 "$OUTPUT_DIR/installed_packages.txt" "$OUTPUT_DIR/recommended_packages_sorted.txt" > "$OUTPUT_DIR/installed_recommended.txt"
comm -23 "$OUTPUT_DIR/recommended_packages_sorted.txt" "$OUTPUT_DIR/installed_packages.txt" > "$OUTPUT_DIR/missing_recommended.txt"
comm -23 "$OUTPUT_DIR/installed_packages.txt" "$OUTPUT_DIR/recommended_packages_sorted.txt" > "$OUTPUT_DIR/additional_installed.txt"

# 生成报告
echo "Generating package comparison report..."
echo "===========================================================" > "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
echo "                      PACKAGE COMPARISON                      " >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
echo "                     Report Date: $REPORT_DATE                " >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
echo "===========================================================" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
echo -e "\n=== Recommended Packages Already Installed ===" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
if [ -s "$OUTPUT_DIR/installed_recommended.txt" ]; then
  cat "$OUTPUT_DIR/installed_recommended.txt" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
else
  echo "No recommended packages are installed" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
fi
installed_count=$(wc -l < "$OUTPUT_DIR/installed_recommended.txt")
recommended_count=$(wc -l < "$OUTPUT_DIR/recommended_packages_sorted.txt")
echo "Installed recommended packages: $installed_count/$recommended_count" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"

# 计算完成度百分比
if [ $recommended_count -gt 0 ]; then
  completion_percent=$(echo "scale=2; $installed_count * 100 / $recommended_count" | bc)
  echo "Completion: $completion_percent%" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
fi

# 添加缺失的推荐软件包
echo -e "\n=== Missing Recommended Packages ===" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
if [ -s "$OUTPUT_DIR/missing_recommended.txt" ]; then
  cat "$OUTPUT_DIR/missing_recommended.txt" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
else
  echo "All recommended packages are installed!" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
fi

# 添加额外安装的软件包
echo -e "\n=== Additional Installed Packages (Not in Recommended List) ===" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
if [ -s "$OUTPUT_DIR/additional_installed.txt" ]; then
  cat "$OUTPUT_DIR/additional_installed.txt" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
else
  echo "No additional packages are installed" >> "$OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"
fi

# 显示完成信息
echo "Package comparison completed!"
echo "Report file: $OUTPUT_DIR/package_comparison_${REPORT_DATE}.txt"

使用示例:

bash 复制代码
# 授予执行权限
chmod +x package_management.sh

# 比较已安装的软件包和推荐的软件包
sudo ./package_management.sh recommended_packages.txt

五、注意事项与最佳实践

1. 命令安装

在大多数Linux发行版中,comm命令通常已经预装在系统中作为coreutils包的一部分。如果没有安装,可以通过以下命令安装:

bash 复制代码
# 在Debian/Ubuntu系统上安装coreutils包
sudo apt-get update
sudo apt-get install -y coreutils

# 在CentOS/RHEL系统上安装coreutils包
sudo yum install -y coreutils

# 在Arch Linux系统上安装coreutils包
sudo pacman -S coreutils

2. 输入文件排序要求

comm命令要求输入文件必须是已排序的,否则可能会产生不正确的结果。在使用comm命令之前,应该确保文件已经排序:

bash 复制代码
# 正确:先排序文件,然后比较
sort file1.txt > file1_sorted.txt
sort file2.txt > file2_sorted.txt
comm file1_sorted.txt file2_sorted.txt

# 错误:直接比较未排序的文件
comm file1.txt file2.txt  # 可能会产生不正确的结果

3. 空行和空白字符处理

comm命令会将空行和包含空白字符的行视为有效行进行比较。在比较文本文件时,应该注意这一点:

bash 复制代码
# 比较前删除空行和空白行
sed '/^\s*$/d' file1.txt | sort > file1_sorted.txt
sed '/^\s*$/d' file2.txt | sort > file2_sorted.txt
comm file1_sorted.txt file2_sorted.txt

# 比较前规范化空白字符
tr -s '[:blank:]' ' ' < file1.txt | sort > file1_sorted.txt
tr -s '[:blank:]' ' ' < file2.txt | sort > file2_sorted.txt
comm file1_sorted.txt file2_sorted.txt

4. 大文件处理

对于大型文件,comm命令的性能通常很好,但排序过程可能会消耗大量资源。对于非常大的文件,可以考虑以下优化:

  • 使用--check-order参数验证文件是否已经排序,避免重复排序
  • 使用临时文件保存排序结果,避免多次排序
  • 考虑使用split命令将大文件分割成小文件,处理后再合并
bash 复制代码
# 检查文件是否已经排序
sort -c file.txt  # 如果文件已经排序,不会输出任何内容;否则会显示错误

# 如果文件已经排序,直接使用;否则进行排序
if ! sort -c file.txt 2>/dev/null; then
  echo "File is not sorted. Sorting..."
  sort file.txt > file_sorted.txt
  file_to_use=file_sorted.txt
else
  echo "File is already sorted. Using original file."
  file_to_use=file.txt
fi

# 使用已排序的文件
comm $file_to_use another_file.txt

5. 与diff命令的区别

comm命令和diff命令都可以用于比较文件,但它们有以下主要区别:

  • comm命令要求输入文件必须是已排序的,而diff命令没有这个要求
  • comm命令主要显示文件的共同行和特有行,而diff命令主要显示文件的具体差异
  • comm命令的输出格式是三列,而diff命令的输出格式更复杂,显示行的添加、删除和修改

根据具体需求,选择合适的工具:

bash 复制代码
# 使用comm命令比较已排序的文件,找出共同行和特有行
comm file1_sorted.txt file2_sorted.txt

# 使用diff命令比较任意文件,找出具体差异
diff file1.txt file2.txt

6. 使用进程替换

在Bash shell中,可以使用进程替换(<(command)语法)来避免创建临时文件:

bash 复制代码
# 使用进程替换避免创建临时文件
comm <(sort file1.txt) <(sort file2.txt)

# 结合其他命令使用进程替换
comm <(grep "pattern" file1.txt | sort) <(grep "pattern" file2.txt | sort)

# 多级进程替换
comm <(sort <(grep "pattern" file1.txt)) <(sort <(grep "pattern" file2.txt))

7. 脚本中的错误处理

在脚本中使用comm命令时,应该添加适当的错误处理:

bash 复制代码
#!/bin/bash
# 带有错误处理的comm脚本示例

# 设置变量
FILE1="$1"
FILE2="$2"

# 检查输入参数
if [ -z "$FILE1" ] || [ -z "$FILE2" ]; then
  echo "Error: Missing required arguments!"
  echo "Usage: $0 file1.txt file2.txt"
  exit 1
fi

# 检查文件是否存在
if [ ! -f "$FILE1" ]; then
  echo "Error: File $FILE1 not found!"
  exit 1
fi

if [ ! -f "$FILE2" ]; then
  echo "Error: File $FILE2 not found!"
  exit 1
fi

# 创建临时文件
trap "rm -f $TMP1 $TMP2" EXIT  # 脚本退出时清理临时文件
TMP1=$(mktemp)
TMP2=$(mktemp)

# 排序文件并检查结果
if ! sort "$FILE1" > "$TMP1"; then
  echo "Error: Failed to sort $FILE1!"
  exit 1
fi

if ! sort "$FILE2" > "$TMP2"; then
  echo "Error: Failed to sort $FILE2!"
  exit 1
fi

# 执行比较并检查结果
if ! comm "$TMP1" "$TMP2"; then
  echo "Error: comm command failed!"
  exit 1
fi

# 脚本成功完成
exit 0

六、常见错误与解决方案

1. 命令未找到

问题现象 :执行comm命令时显示"command not found"错误。

解决方案

  • 确认是否安装了coreutils包
  • 检查命令是否在系统PATH中
bash 复制代码
# 查找comm命令位置
which comm
# 或
find / -name comm 2>/dev/null

# 安装coreutils包(如果尚未安装)
sudo apt-get install coreutils  # Debian/Ubuntu
sudo yum install coreutils      # CentOS/RHEL
sudo pacman -S coreutils        # Arch Linux

2. 比较结果不正确

问题现象comm命令的比较结果不符合预期,可能是因为文件未排序。

解决方案

  • 确保输入文件在比较前已经排序
  • 使用--check-order参数验证文件排序
  • 检查文件的字符编码和行结束符
bash 复制代码
# 确保文件已经排序
sort file1.txt > file1_sorted.txt
sort file2.txt > file2_sorted.txt

# 验证文件排序
comm --check-order file1_sorted.txt file2_sorted.txt

# 检查文件的字符编码
file -i file1.txt file2.txt

# 统一文件的行结束符(DOS到Unix)
dos2unix file1.txt file2.txt

3. 输出格式问题

问题现象comm命令的输出格式不符合预期,特别是列对齐问题。

解决方案

  • 使用--output-delimiter参数指定自定义分隔符
  • 结合column命令格式化输出
  • 结合awk命令进行更复杂的格式化
bash 复制代码
# 使用自定义分隔符
comm --output-delimiter=" | " file1.txt file2.txt

# 结合column命令格式化输出
comm file1.txt file2.txt | column -t -s "\t"

# 结合awk命令进行更复杂的格式化
comm file1.txt file2.txt | awk '{printf "%-30s %-30s %-30s\n", $1, $2, $3}'

4. 输入文件权限问题

问题现象 :执行comm命令时显示"Permission denied"错误。

解决方案

  • 确认对输入文件有读取权限
  • 确认对输出目录有写入权限
  • 检查文件所有权
bash 复制代码
# 检查文件权限
ls -l file1.txt file2.txt

# 检查输出目录权限
ls -ld $(dirname output.txt)

# 更改文件权限(如果需要)
chmod +r file1.txt file2.txt
chmod +w $(dirname output.txt)

# 以适当的用户身份运行命令
sudo -u username comm file1.txt file2.txt

5. 内存或资源不足

问题现象 :处理大型文件时,comm命令可能会因内存或资源不足而失败。

解决方案

  • 增加系统内存(如果可能)
  • 使用split命令将大文件分割成小文件,处理后再合并
  • 考虑使用其他工具(如joinawk)进行大文件处理
bash 复制代码
# 使用split命令分割大文件
split -l 10000 large_file.txt chunk_

# 处理分割后的文件
for i in chunk_*; do
  sort $i > ${i}_sorted
done

# 合并排序后的文件
cat chunk_*_sorted | sort > large_file_sorted.txt

# 清理临时文件
rm chunk_* chunk_*_sorted

# 使用排序后的文件进行比较
comm large_file_sorted.txt another_file.txt

6. 特殊字符问题

问题现象 :处理包含特殊字符(如制表符、换行符等)的文件时,comm命令可能会产生不正确的结果。

解决方案

  • 在比较前规范化特殊字符
  • 考虑使用其他工具(如diffgrep)进行特殊字符处理
  • 检查文件的字符编码
bash 复制代码
# 规范化制表符
expand -t 8 file_with_tabs.txt | sort > file_sorted.txt

# 规范化换行符
tr -s '\n' < file_with_blank_lines.txt | sort > file_sorted.txt

# 检查文件编码
file -i file.txt

7. 性能问题

问题现象comm命令处理大型文件时速度较慢。

解决方案

  • 确保文件已经排序,避免重复排序
  • 对于重复执行的任务,保存排序结果供后续使用
  • 考虑使用更高效的算法或工具
bash 复制代码
# 保存排序结果供后续使用
if [ ! -f "file_sorted.txt" ]; then
  echo "Sorting file..."
  sort file.txt > file_sorted.txt
fi

# 使用预排序的文件
comm file_sorted.txt another_file.txt

# 考虑使用更高效的工具(如GNU coreutils的comm版本)
# 大多数现代Linux发行版已经使用了优化的版本

七、总结

comm命令是Linux系统中一个强大的文件比较工具,专门用于逐行比较两个已排序的文本文件。它能够精确地找出两个文件中共同存在的行、只在第一个文件中存在的行以及只在第二个文件中存在的行,为文本分析和差异检测提供了有力支持。

通过灵活使用comm命令的各种参数(如-1-2-3等),可以自定义输出结果,只显示关心的部分。结合其他Linux命令(如sortgrepsedawk等),comm命令可以成为复杂文本处理管道中的重要环节,帮助完成各种文本分析和数据比较任务。

在实际应用中,comm命令常用于配置文件比较、用户和组管理、数据同步与合并以及软件包管理等场景。通过掌握comm命令的基本用法和高级技巧,可以显著提高Linux系统中文本处理和比较的效率和灵活性。

在使用comm命令时,需要注意输入文件必须已排序、空行和空白字符的处理、大文件处理以及与其他工具(如diff命令)的区别等方面的问题。通过遵循最佳实践和及时解决常见错误,可以充分发挥comm命令的潜力,为Linux系统管理和开发工作提供有力支持。

相关推荐
I · T · LUCKYBOOM1 分钟前
2.2yum安装--单服务器托管多网站
linux·运维·服务器
郝学胜-神的一滴4 分钟前
线程同步:并行世界的秩序守护者
java·linux·开发语言·c++·程序人生
龘龍龙5 分钟前
Python基础学习(十)
服务器·python·学习
im_AMBER5 分钟前
Leetcode 95 分割链表
数据结构·c++·笔记·学习·算法·leetcode·链表
青茶3606 分钟前
【js教程】如何用jq的js方法获取url链接上的参数值?
开发语言·前端·javascript
北岛寒沫7 分钟前
北京大学国家发展研究院 经济学原理课程笔记(第十八课 国内生产总值与物价水平)
经验分享·笔记·学习
Linux技术芯10 分钟前
浅谈nvme协议版本的发展
linux
释怀不想释怀13 分钟前
Linux(复习常见命令)
linux·运维·服务器
Wpa.wk14 分钟前
接口自动化 - 解决大量响应数据字段的格式断言 -Json-schema
运维·经验分享·测试工具·自动化·json·接口测试
_F_y16 分钟前
负载均衡在线oj(文件版)
linux·运维·负载均衡