0%

linux脚本攻略之命令之乐

shell脚本攻略第二章之脚本之乐

这一章主要是对shell中常用的各种命令的介绍。

cat的使用技巧,cat命令主要用于输出文本
#!/bin/bash

# 用cat进行拼接 cat file1 file2 file3
# 这行语句会拼接echo的文本和file.txt 的文本输出出来
echo 'text through stdin' | cat - file.txt

# 压缩空白行,可以将文本中的多个空行压缩成单个
cat -s file.txt

# 添加行号
cat -n file.txt
find命令的使用技巧,find主要用来查询符合条件的文件或者目录,是非常重要的shell命令。
#!/bin/bash

# find 命令会沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作 find base_dir

# .z指当前目录,-print 指打印出匹配的文件名
find . -print

# 根据文件名或正则表达式匹配搜索 -name ,-iname(忽略大小写)
find /data/project -name '*.txt' -print

## 匹配多个条件
find . \( -name "*.txt" -o -name "*.pdf" \) -print

# -path 可以使用通配符来匹配文件路径和文件
find /data/project -path "*harper*" -print

# 否定参数,find可以用"!" 否定参数的含义
find . | -name "*.txt" -print

# 基于目录深度的搜索 -maxdepth -mindepth
find . -maxdepth 1 -type f -print 

# 根据文件类型搜索,-type
# 只列出所有的目录
find . -type d -print
# 只列出所有的文件
find . -type f -print
# 只列出符号链接
find . -type l -print

# 根据文件时间搜索  -atime:最近一次访问文件的时间,-mtime:最后一次修改的时间,-ctime:权限最后一次更改的时间,单位是天,前面带+号表
示大于,-号表示小于# 打印出最近七天内被访问的文件
find . -type f -atime -7 -print
# 基于分钟的计量单位 -amin ,-mmin,-cmin 
# 打印出访问时间超过7分钟的文件
find . -type f -amin +7 -print


# 基于文件大小的搜索
find . -type f -size + 2k
# 计量单位 k:kb,b:块,c:字节,w:2字节,

# 删除匹配的文件
find . -type f -name "*.swp" -delete

# 基于权限的搜索
find . -type f -perm 644 -print

# 根据文件的所有权搜索
find .-type f -user harper -print

# 结合-exec执行命令,{}是一个特殊的字符串,与-exec结合使用,对于每一个匹配的文件,{}会被替换成相应的文件名

# 将本目录下的所有权为root的文件更改为harper的
find . -type f -user root -exec chown harper {} \;
# 将10天千的.txt文件复制到old目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} old \;
xargs的使用技巧,xargs经常与find命令一起使用,它可以将接收到的数据冲i性能格式化,在作为参数提供给其他命令,作为中间管道为数据的处理提供了很大的方便。
#!/bin/bash

# command | xargs,xargs 可以从stdin接收到的数据重新格式化,再将其作为参数提供给其他命令

# 将多行输入转换成单行输出,只需要将换行符移除,在用空格代替
# cat file.txt | xargs 

cat example.txt | xargs -n 3

# -d 执行定界符,使用x进行分割,-n指定每行的最大的参数数量n
echo "aaaxbbbxcccxddd" | xargs -d x -n 2

# 每此指定一个参数传输
cat args.txt | xargs -n 1 ./cecho.sh

# 用find找出所有的.txt 文件,用xargs 删除, -0 将\0 作为输入的定界符
find .-type f -name "*.txt" -print0 | xargs -0 rm -f

# 统计代码目录中的c程序文件的行数
find /data/project -type f -name "*.c" -print0 | xargs -0 wc -l

# 给文件夹中的所有sh文件加上x执行权限
find . -type f -name '*.sh' -print0 | xargs -0 chmod u-x
t的使用技巧,tr主要用于对输入的字符进行替换删除以及压缩,类似与java中map
#!/bin/bash

# tr是转换命令,可以对标准输入的字符进行替换,删除,和压缩,将一组字符转换成另一组字符
# tr [option] set1 set2 set 为字符集

# 将字符由大写转成小写
echo "HELLO" | tr "A-Z" "a-z"

# 用tr删除字符,-d是删除,不需要写set2
echo "hello 123 world 456" | tr -d '0-9'

# 字符集补集,tr -c [set1] [set2]
# 删除不在0-9的所有字符
echo hello 1 char 2 next 3 | tr -d -c '0-9 \n'

# 压缩字符,-s可以去掉输入中的重复字符
echo "GNU is              not unix, right ?" | tr -s ' '
  • 定义一个文件
1
2
3
4
5
  • 我们将这个文件的数字加起来,可以用下面的方式去做

  • # tr先将'\n' 替换成+,得到1+2+3+4+5+ 但是多了一个+,所以补一个0,$[ opertion ] 在执行运算操作
    cat sum.txt | echo $[ $( tr '\n' '+' ) 0  ]
sort命令的使用技巧,sort用于对文本进行排序,通常与uniq一起使用,uniq可以去重
#!/bin/bash

# sort可以对stdin或文本进行排序,uniq作用是从文本或stdin中提取单一的行

# 找出已排序的文件中不重复的行
sort file1.txt file2.txt > sorted.txt | uniq  > uniq_line.txt

# sort按数字排序
sort -n file1.txt

# 按逆序排序
sort -r file1.txt

# 按月份排序
sort -M file1.txt

# 根据key排序,key指的是文本的列,-nr指数字逆序,k指按照哪列排序
sort -nrk 2 sort.txt

# -u只显示唯一的行
sort -u sorted.txt

# 统计各行在文件中出现的次数
sort sorted.txt | uniq -c 

# 找出重复的行
sort sort.txt | uniq -d 

# 使用-z可以生成0值字节终止符(与xargs 配合,使用0值终止符更安全)
uniq -z file.txt | xargs -0 rm 
splite的使用,splite可以对文件进行分割。
  • 我们先生成一个100k的文件出来

    dd if=/dev/zero bs=100k count=1 of=data.txt
  • 执行切割的命令

    #!/bin/bash
    
    # split [command_args] prefix
    # 将文件分割成10k的文件,-d 使用数字作为后缀,-a指定后缀的长度
    split -b 10k data.file -d -a 4
~~