Linux&Shell面试知识点总结

一、Linux基础命令

  1. ‌进程管理‌

    • 查看系统进程:ps auxtop/htop(实时监控)
    • 杀死进程:kill -9 <PID>pkill <进程名>
  2. ‌文件操作‌

    • 查看文件尾部:tail -n 10 filename(末10行)
    • 实时监控文件变化:tail -f filename
    • 批量查找文件内容:grep -r "keyword" /path(递归搜索)
  3. ‌权限管理‌

    • 修改权限:chmod 755 filename(数字模式)
    • 修改所有者:chown user:group filename

 

二、Shell脚本核心

  1. ‌变量与参数‌

    • $*$@区别:不加引号时功能类似,加引号时"$*"视为整体字符串,"$@"保留参数分隔
    • 变量作用域:var=value(局部变量) vs export var=value(全局变量)
  2. ‌流程控制‌

        • ‌条件判断‌:
          if [ $a -gt $b ];
            then echo "a大于b"
          elif [ $a -eq $b ];
            then echo "a等于b"
          else
            echo "a小于b"
          fi
           
        • ‌循环结构‌:
          # for循环 
          for i in {1..5};
          do
            echo $i;
          done
           
          # while循环 
          while [ $count -lt 5 ];
          do
            ((count++));
          done

           

  3. ‌输入输出重定向‌

  • 标准输出+错误输出合并:command &> output.txt
  • 管道操作:cat file.txt | grep "error" | sort

   4. 单引号和双引号区别

  • ‌单引号 ' '‌

‌  完全原样输出‌:单引号内的所有内容均视为纯文本,‌不解析任何变量、命令或转义字符‌。
‌  不可嵌套单引号‌:单引号内无法直接包含单引号(即使用转义符 \ 也不行)。
‌  示例‌:

  echo 'Hello $USER, today is $(date)'
  ‌输出‌:
  Hello $USER, today is $(date) # 变量和命令均未解析
  • 双引号 " "‌

‌  允许变量替换和命令替换‌:$VAR 和 $(command) 会被解析。
‌  支持部分转义字符‌:如 \$(保留 $ 字面值)、\"(保留 ")、\n(换行符)等。
‌  可嵌套单引号‌:双引号内可以直接包含单引号。
‌  示例‌:

  name="Alice"
  echo "Hello $name, today is $(date +%F)"
‌  输出‌:
  Hello Alice, today is 2023-12-25   # 变量和命令已解析


三、文本处理三剑客

  1. ‌sed‌ (精准编辑,适合批量修改)

    • 替换文本:sed 's/old/new/g' file.txt  # 直接修改使用-i参数
    • 删除空行:sed '/^$/d' file.txt
    • 提取内容:  sed -n '10,20p' file.txt   # 提取第10-20行内容
  2. ‌awk‌  (结构化处理,适合复杂数据分析和报告生成)

    • 提取列数据:awk '{print $1,$3}' file.txt       # 提取第1列和第3列
    • 条件过滤:awk '$3 > 100 {print $0}' file.txt    # 过滤第3列值大约100的数据
    • 提取数据进行计算: awk '{sum += $2} END {print sum}' file.txt  # 统计第2列总和(数值列)
  3. ‌grep (快速搜索,适合简单过滤)

    • 搜索包含"error"的行(显示行号): grep -n 'error' file.txt
    • 匹配IP地址:grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}'
    • 递归搜索目录中文件内容:  grep -rn --include="*.java" "TODO" ./src   # 递归搜索目录中所有Java文件内的"TODO"注释
    • 统计匹配行数:   grep -c "success" file.txt 

 

四、高级特性与调试

  1. ‌信号处理‌

    • 捕获信号:trap "echo '程序被中断'" SIGINT
  2. ‌脚本调试‌

    • 启用调试模式:set -x(显示执行命令)
    • 错误中断:set -e(任何命令失败立即退出)
    1. ‌函数与参数传递‌

      function greet() {
        echo "Hello, $1!"
      }
       
      greet "World"
       
      # 输出:Hello, World!

       

五、系统管理相关

  1. ‌用户与组‌

    • 创建用户:useradd -m username
    • 修改默认Shell:chsh -s /bin/zsh username
  2. ‌软件包管理‌

    • RPM安装:rpm -ivh package.rpm
    • YUM更新:yum update package
  3. ‌磁盘与内存‌

    • 查看磁盘空间:df -h
    • 监控内存使用:free -m

 

六、面试拓展题

  1. ‌实战问题示例‌

    • 如何统计日志文件中每个IP的访问次数?
      awk '{print $1}' access.log | sort | uniq -c | sort -nr
       
      说明: 
      # uniq命令可以使用参数-c来统计重复行出现次数

      # sort 命令参数:
      -n:按数值大小排序(而非默认的字典序),避免将 10 排在 2 前的错误。
      ‌-r‌:逆序排序(从大到小)。
      -k:指定排序的列(如 -k3 按第三列排序)。
      -t:指定列分隔符(如 -t':' 以冒号分隔字段)。

       

    • 如何用Shell实现批量文件重命名(添加日期后缀)?
      for file in *.txt; do mv "$file" "${file%.txt}_$(date +%F).txt"; done
  2. ‌高频陷阱题‌

    • [ $a == $b ][[ $a == $b ]]区别(后者支持模式匹配)
    • $(cmd)\cmd``的区别(推荐使用$(),支持嵌套)
 
posted @ 2025-04-22 14:35  业余砖家  阅读(90)  评论(0)    收藏  举报