shell脚本处理笔记
- [一 打印文本中指定行](#一 打印文本中指定行)
-
- [1. 打印单行](#1. 打印单行)
-
- [方法1:使用 sed(最常用)](#方法1:使用 sed(最常用))
- [方法2:使用 awk](#方法2:使用 awk)
- [方法3:使用 head 和 tail 组合](#方法3:使用 head 和 tail 组合)
- [2. 打印多行范围](#2. 打印多行范围)
- [3. 打印不连续的多行](#3. 打印不连续的多行)
- [4. 打印最后几行](#4. 打印最后几行)
- [5. 打印除指定行外的其他行](#5. 打印除指定行外的其他行)
- [6. 高级用法](#6. 高级用法)
- [8. 管道处理示例](#8. 管道处理示例)
- [9. 函数封装](#9. 函数封装)
- [二 遍历当前目录下的所有文件夹](#二 遍历当前目录下的所有文件夹)
- [三 乘法运算](#三 乘法运算)
一 打印文本中指定行
1. 打印单行
方法1:使用 sed(最常用)
bash
# 打印第5行
sed -n '5p' filename.txt
# 或使用更简洁的语法
sed '5!d' filename.txt
方法2:使用 awk
bash
# 打印第5行
awk 'NR==5' filename.txt
方法3:使用 head 和 tail 组合
bash
# 打印第5行
head -n 5 filename.txt | tail -n 1
2. 打印多行范围
打印第5-10行
bash
# 方法1:sed
sed -n '5,10p' filename.txt
# 方法2:awk
awk 'NR>=5 && NR<=10' filename.txt
# 方法3:head+tail
head -n 10 filename.txt | tail -n 6
3. 打印不连续的多行
打印第3、7、9行
bash
# 方法1:sed(多条命令)
sed -n '3p;7p;9p' filename.txt
# 方法2:awk
awk 'NR==3 || NR==7 || NR==9' filename.txt
4. 打印最后几行
打印倒数第5行
bash
# 方法1:tail + head
tail -n 5 filename.txt | head -n 1
# 方法2:awk(计算行数)
awk '{a[NR]=$0} END{print a[NR-4]}' filename.txt
5. 打印除指定行外的其他行
打印除第5行外的所有行
bash
# 方法1:sed
sed '5d' filename.txt
# 方法2:awk
awk 'NR!=5' filename.txt
6. 高级用法
打印匹配模式的行及其后2行
bash
# 打印包含"error"的行及其后2行
sed -n '/error/,+2p' filename.txt
# 或使用awk
awk '/error/{print; getline; print; getline; print}' filename.txt
打印偶数行/奇数行
bash
# 打印偶数行
awk 'NR%2==0' filename.txt
# 或使用sed
sed -n 'n;p' filename.txt
# 打印奇数行
awk 'NR%2==1' filename.txt
# 或使用sed
sed -n 'p;n' filename.txt
8. 管道处理示例
bash
# 处理其他命令的输出
ls -la | sed -n '5p' # 打印第5行
ps aux | awk 'NR==2' # 打印第2行
df -h | sed -n '2,4p' # 打印第2-4行
9. 函数封装
bash
#!/bin/bash
# 函数:打印文件指定行
print_lines() {
local file=$1
local start=$2
local end=${3:-$start} # 如果未提供结束行,则只打印起始行
if [ ! -f "$file" ]; then
echo "错误: 文件不存在"
return 1
fi
sed -n "${start},${end}p" "$file"
}
# 使用示例
print_lines "filename.txt" 5 # 打印第5行
print_lines "filename.txt" 3 7 # 打印第3-7行
推荐使用 sed -n '行号p' filename 或 sed -n '起始行,结束行p' filename,这是最简洁高效的方法。
二 遍历当前目录下的所有文件夹
bash
for subdir in `ls ./`; do
if [ -d "$subdir" ]; then
echo "文件夹: $subdir"
else
echo "$subdir not exist"
fi
done
三 乘法运算
bash
c = $[ 2 * 3 ]
d = $[ 2 * $c ]
注意中括号内空格