S_lion's Studio

shell备忘录

字数统计: 956阅读时长: 4 min
2022/04/10 Share

好记性不如烂笔头,记录常用的指令

cut、sort

1
2
3
Cut  -d ":"  -f2   /etc/passwd
sort -t ":" -k2 /etc/passwd
sort -u 排序前去重 -n 按大小排序 -r 降序排序

uniq、tr、split

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 去掉重复的行并显示重复了几行
uniq -c /etc/passwd

# 转换大小写
tr

# 和<<作用一样,都是追加重定向,不同的是tee会打印显示到交互界面
tee

# 批量给文件加后缀
ls /root | xargs -i mv {} {}.txt

# 按行给文件切割
split -l 10 /etc/passwd
按大小给文件切割
split -b 1M /etc/passwd

sed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 打印出指定的行
sed -n '/root/p' /etc/passwd
# -r可以不用转义符号打印
sed -r '/(o+)*/p' /etc/passwd
# 删除带有root的行
sed '/root/d' /etc/passwd
# 显示行号并删除1到5行
grep -n '.*' /etc/passwd |sed ‘1,5d’
# 把root替换成lions
sed 's/root/lions/g' /etc/passwd
# 也可以在指定的行替换
sed '1,10s/root/lions/g' /etc/passwd
# 直接修改源文件
sed -i
# &号为引用前面查到的字符串
sed 's/root/&admin/' /etc/passwd
# 把passwd中每行第一个字符串和最后一个字符串调换
sed -r 's/ ([^:]+)(: .* :)([^:]+) / \3\2\1 /' /etc/passwd
# sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号
test=hello;echo hello |sed "s/$test/HELLO"
# 打印含有test和check的行
sed -n '/test/,/check/p' file

awk

1
2
3
4
5
6
7
8
9
10
11
12
# 匹配第一行是root的行,注意~符号
awk -F ':' '$1~/root/' /etc/passwd
# FS 输入字段分隔符,默认空格
awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd
# OFS 输出字段分隔符
awk 'BEGIN{FS=":";OFS="+++"} /^root/{print $1,$3}' /etc/passwd
# NF 处理每一行的字段数量 $NF为每行最后一个字段
awk -F " " 'print $(NF-1)' /etc/passwd
# 查看每行倒数第二个字段
# 使用 grep 查找 Pss 指标后,再用 awk 计算累加值
grep Pss /proc/[1-9]*/smaps | awk '{total+=$2}; END {printf "%d kB\n", total }'
391266 kB

grep

1
2
3
4
# 对比两个文件中不同处,其中newfile为搜寻样式文件
grep -vFf <newfile> file
# 当前目录下所有文件中包含word的文件
grep -rne "word" .

date

1
2
3
4
5
6
7
#  格式化输出
date +"%Y-%m-%d:%H:%M:%S"
# 获取系统时区
date +%z
+0800
date +%Z
CST

echo

1
2
3
4
5
6
7
8
9
10
11
12
# 不换行输出
echo -n
# 支持转义
echo -e
# echo输出计算结果
echo $((2*3))
6
a=5;b=7;c=2
echo $((a+b*c))
19
echo $(($a+$b*$c))
19

xargs与exec

1
2
3
4
5
6
7
8
9
10
11
12
# 找到根目录下所有的以test开头的文件并把查找结果当做参数传给rm -rf命令进行删除: 
find / -name "test*" |xargs rm -rf
find / -name "test*" -exec rm -rf {} \;
rm -rf $(find / -name “test”)
# 如果想指定递归深度,可以这样:
find / -maxdepth 3 -name "*.mp3" |xargs rm -rf
find / -maxdepth 3 -name "test*" -exec rm -rf {} \;
rm -rf $(find / -maxdepth 3 -name “test”)
# 利用inode删除指定的文件
find ./ -inum 1049741 |xargs rm -f
# 批量给文件加后缀
ls /root | xargs -i mv {} {}.txt

vim

1
2
3
4
# 删除每行前10个字符
:%s/^.\{10\}//
# 删除每行末10个字符
:%s/.\{10\}$//

seq

1
2
3
4
5
6
7
8
9
seq 输出数字序列
# 指定分隔符,默认是\n
seq -s
# 指定输出数字同宽
seq -w

生成数值列表:
for i in {10..20}
for i in ${seq 10 20} 或者'seq 10 20'

shell特殊符号

1
2
3
4
5
6
7
8
$?上一个命令的状态返回值
$# 传递给脚本参数的个数
$*
$@ 引用传递给脚本的所有参数
!! 执行上一个命令
${variable:-tom} 如果变量variable没有赋予值则使用Tom作为默认值
${variable:+tom} 如果给变量variable赋值了则使用Tom
$( )与' '在操作上会达到相同的效果
CATALOG
  1. 1. cut、sort
  2. 2. uniq、tr、split
  3. 3. sed
  4. 4. awk
  5. 5. grep
  6. 6. date
  7. 7. echo
  8. 8. xargs与exec
  9. 9. vim
  10. 10. seq
  11. 11. shell特殊符号