《Linux Shell 脚本攻略》学习记录之三

CAT
cat本身表示concatenate(拼接)
cat file1 file2 file3 ...

将标准输入与另外一个文件数据结合在一起
echo 'Text through stdin' | cat - file.txt

摆脱多余的空白行
cat -s file.txt

将制表符显示为^| 
cat -t file.txt

显示行号,如果要跳过空白行使用-b
cat -n file.txt
cat -nb file.txt 跳过空白行

FIND
打印文件和目录的列表
find . -print
find -name 
find -iname 忽略大小写

如果匹配多个条件,使用OR
find . \(-name "*.txt" -o -name "*.pdf" \) -print  ???????????????

匹配多个文件类型
find . -regex ".*\(\.pdf\|\.txt\)$"

排除某些类型
find . ! -name "*.txt" -print

基于目录深度的搜索
find . -maxdepth 1 -name "f*" -print 指定深度以内的
find . -mindepth 2 -name "f*“ -print 指定目的深度,排除一些
-maxdepth - mindeptch 作为第三个参数出现,如果作为第四个参数,效率会降低

根据文件类型进行搜索
find . -type d -print 目录
find . -type f -print 普通文件
find . -type l -print  符号链接
c 字符设备   
b 块设备
s 套接字
p FIFO

根据文件时间进行搜索
UNIX/Linux文件系统中的每一个文件都有三种时间戳
访问时间(-atime): 用户最近一次访问的时间
修改时间(-mtime): 文件内容最后一次呗修改的时间
变化时间(-ctime): 文件元数据(例如权限或所有权)最后一次改变的时间
单位是天,这些整数通常还带有-或+:-表示小于,+表示大于。

打印最近7天内被访问的所有文件
find . -type f -atime -7 -print

打印出恰好在7天前被访问过的所有文件
find . -type f -atime 7 -print

打印出访问时间超过7天的所有文件
find . -type f -atime +7 -print

单位时间为分钟的
-amin (访问时间)
-mmin (修改时间)
-cmin (变化时间)

find 另一个漂亮的特性是-newer参数,使用它可以比较时间戳比参考文件更新的所有文件
find . -type f -newer file.txt -print

基于文件大小的搜索
大于2k
find . -type f -size +2k

小于2k
find . -type f -size -2k

大小等于2k的文件
find . -type f -size 2k

除k之外,还有其他文件大小单元
b -块 512字节
c 字节
w 字 2字节
k 1024字节
M 1024k
G 1024M 

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

基于文件权限和所有权的匹配
find . -type f -perm 644 -print
打印没有设置好知执行权限的文件
find . -type f -name "*.php" ! -perm 644 -print

打印用户拥有的文件
find . -type f -user slynux -print

find借助-exec,执行其他命令
修改权限
find . -type f -user root -exec chown slynux {} \;all_files.txt

将10天前的.txt文件复制到OLD目录中
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;

-exec 结合多个命令
-exec是单个命令的,不过可以使用一个shell脚本
-exec ./commands.sh {] \;

让find跳过特定的目录
find . \(-type -print \(-name ".git" -prune \) -o \( -type f -print\)

ARGS
一行显示参数
cat *.txt | xargs

每行3个参数
cat *.txt | xargs -n 3

使用定界符分割
echo "splixXsplixXsplixXsplix" | xargs -d X

echo "splixXsplixXsplixXsplix" | xargs -d X -n 2


TR
用tr进行转换
tr可以对来自标准输入的内容进行字符替换,字符删除,重复字符压缩,因而通常称为转换命令。
将输入字符由大写转换为小写
echo "HELLO WHO IS THIS" | tr 'A-Z' 'a-z'

tr替换
加密
echo 12345 | tr '0-9' '9876543210'
解密
echo 87654 | tr '9876543210' '0-9'

tr删除字符
echo "Hello 123 world 456" | tr -d '0-9'

字符集补集
echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'

用tr压缩字符
echo "GNU is     not      UNIX. Recursive    right   ?"  | tr -s ' '

字符类
alnum :  字母和数字
alpha :  字母
cntrl :  控制字符
digit : 数字
graph :  图形字符
lower :  小写字母
print :  可打印字符
punct :  标号符号
space : 空白字符
upper :  大写字母
xdigit : 十六进制字符
可以按照下面的方式选择并使用所需的字符类。
tr [:class:] [:class:]
例如
tr '[:lower:]' '[:upper:]'

校验和与核实
md5sum filename

多个
md5sum file1 file2 file3 ...

验证
md5sum filename > file_sum.md5
md5sum -c file_sum.md5
md5sum -c *.md5

对目录进行校验和
md5deep -rl directory_path > directory.md5
-r使用递归的方式
-l使用相对路径。默认情况下,md5deep会输出文件的绝对路径。
用下面的命令进行核实
md5sum -c directory.md5

加密工具与散列
crypt,gpg,base64,md5sum,sha1sum以及openssl的用法。

gpg -c filename 读取口令加密文件

gpg filename.gpg 读取口令,然后对文件进行解密


将文件编码为Base64格式
base64 filename > outputfile
或者
cat file | base64 > outputfile

解码Base64数据
base64 -d file > outputfile
或者
cat base64_file | base64 -d > outputfile

临时文件命令与随机数
创建临时文件
filename=`mktemp`
echo $filename

创建临时目录
dirname=`mktemp -d`
echo $dirname

只生成目录或文件名,不产生文件
tempfile=`mktemp -u`
echo $tempfile

根据模板创建临时文件名
mktemp test.XXX

分割文件和数据
split -b 10k data.file 按块10k分割文件
split -b 10k data.file -d -a 4 以后缀为4位数字,-d 数字后缀 -a 表示长度
split -b 10k data.file -d -a 4 split_file split_file前缀

用行数来分割
split -l 10 data.file 分割多个文件,每个文件包含10行

csplit工具
是split工具的一个变体,split只能根据数据大小或行数来分割文件,而csplit可以根据
文本自身的特点进行分割。
SERVER-1
XXXXXXXXXX
SERVER-2
XXXXXXXXXX
SERVER-3
XXXXXXXXXX

csplit 1.txt /SERVER/ -n 2 -s {*} -f server -b "%02d.log" ; rm server00.log
/SERVER/ 用来匹配某一行,分割过程即从此处开始
{*} 表示根据匹配重复执行分割,直到文件末尾为止。可以用{整数}的形式来指定分割执行的次数。
-s 使命令进入静默模式,不打印其他信息
-n指定分割后的文件名后缀的数字个数,例如01,02,03等。
-f 指定分割后的文件前缀(在上面的例子中,server就是前缀)
-b 指定后缀格式。例如%02d.log,类似于C语言中的printf的参数格式。在这里
文件名=前缀+后缀=server + %02d.log
因为分割后的第一个文件没有任何内容(匹配的单词就位于文件的第一行中),所以我们删除了server00.log

你可能感兴趣的:(《Linux Shell 脚本攻略》学习记录之三)