tags: Shell
Categories: Shell
第四章-让文本飞
需要熟练的使用sed, awk, grep, cut可以较好的处理文本文件
使用正则表达式
1. 位置锚点
"^" : 表示匹配的文本,必须起始于字符串的首部,eg: ^renf 能够匹配renf开头的行
“ 能够匹配以dat结尾的行
2. 标识符
. : 任意匹配
[] : 括号内部的任意匹配, 如renf[0-6].txt: 则匹配任意renf0.txt 到renf6.txt的文件
[^] : 表示非, 如renf[^12], 出去renf1 与renf2的其他ren*文件。
3. 数量修饰符
以上的标识符在一次表达中,出现一次或多次,或不出现。 可以用数量修饰符定义出现的次数
? 匹配之前的项1次或0次, eg: colou?r能匹配color或者colour,
- 匹配之前的项1次或多次
- 匹配之前的项0次或多次 col能够匹配cl, col, coool
{n} 匹配之前的项n次 [0-9]{3}能任意匹配的三位数, 相当于:[0-9][0-9][0-9]
{n, } 之前的项至少匹配n次 [0-9]{2, } 能过匹配任意的一个两位或者更多位的数字
{n, m} 之前的项必须*匹配的最小n次和最大m次 [0-9]{2,5}能匹配两位到五位数之间的任意一个数字
4. 其他特殊
() 将括号中的内容视为一个整体, eg: ma(tri)?x, 能匹配ma, 或matri
| 表示或 Oct (1 | 2) 能匹配Oct 1 或 Oct 2
\ 特殊字符需要加的转义符号
5. grep
5.1 一般使用
grep convergence reml.out # 在reml.out中寻找含 convergence的行
grep conver file1 file2 # 可以在多个文件中搜索
5.2 当然grep 一般和正则表达结合是非常厉害的
grep -E "[con]+" reml.ot
或者 egrep是默认有正则表达式
egrep "[con]+" renm.out
5.3 其他参数
-o 只给出匹配的文本(不是行)
-v 显示出不匹配的所有行(invert)
-c 显示匹配的总的行数, 这里统计的是行数,而不是匹配的次数(有时一个行内有多个匹配)
统计次数:
egrep -o ''[con]" file | wc -l
-n 显示匹配的所在行的行号, 也就可以加多个文件进行
-b -o 显示匹配所在行的字符偏移
-l 返回匹配的文件名列表, -L
目录下文件搜索
grep "con" . -R -n #当前目录下搜索所有含con的目录+文件+行, 包含子文件内
-i 忽略大小写,
-e 多个匹配模式 eg: grep -e AIC -e BIC
-f 将其搜索的内容写在文件中,进行读取,使用
--include 指定文件搜索:
grep "main()" . r --include *.{c, cpp} #搜索所有的.c .cpp的文件
类似; --exclude 排除; 同时加 --exclude-dir 排除搜索目录
-A 打印匹配行以后的结果,n指定行数, grep con -A 3 reml.out
-B 类似上述,但是打印以前的直接
-C 是打印之前和之后的共同输出
以上三个参数,当有多个匹配时, 会以--作为间隔
6 xargs
xargs 命令可以为其他命令提供命令行参数列表
当文件名为命令行参数时, 建议0值作为文件名结尾,不是空格。
如: grep "test" file* -lZ | xargs -0 rm # 将含有test的file*文件删除
-l 只输出文件名, -Z grep使用0值字节(\0)作为文件名的终结符,两者通常一起使用。 xargs -0 会告诉rm命令,使用0值作为输入的分节符
cut
每一列被称为一个字段
-f 选出需要有的字段, cut -f2,3 file # 选出file的第二和第三列
--complement 选出没有-f指定的其他列, cut -f2 --complement file #显示除了第二列的其他所有列
-d 设置文件中的分割符号, cut -f2 -d";" file # 分隔符为;
指定字段的字符或字节范围(提出本组的EBV数据,可以用),
N- 从第N个字节、字符或字段开始到结尾
N-M 从第N个字节、字符或字段开始到M结束(包括M)
-M 从第一个到第M个
-b 表示字节
-c 表示字符 ##我们常用
-f 用于定于字段
--output-delimiter 指定输出的分隔符,多组数据时使用。
eg cut range.txt -c1-3,6-9 --output-delimiter ","
sed替换文本
基本调用格式: sed 's/pattern/replace_string/' file
sed默认只打印出被替换的文本
-i 会使用sed用修改的数据替换原始文件
g, 会使每行中多次匹配的文字被修改, sed ‘ s/test/replace_test/g’ file
/#g ,可以标记替换第N次出现以后的匹配。 sed 's/test/rplace_test/2g' file 第二次匹配以后的全部被替换
sed默认s以后的字符为分隔符, 如: sed 's,tesx,repalce,g' file 则表示, 为分隔符
去除空行: sed '/^匹配空行, /d 表示不是执行替换,而是之间删除匹配的空行
-i 直接就原文件中修改内容 sed 's/test/replace_test/' -i filename
使用指定的数值替换文件中中所有3位数的数字
sed -i 's/\b[0-9]{3}\b/Replace_number/g' file
\b[0-9]{3}\b 匹配三位数, \b表示边界
sed -i.bak 's/a/c/g' file 用c代替全部的a, 并且在原文件修改,但同时会生成file.bak原文件的副本
& 已匹配字符串符号
sed 's/\w+/[&]/g' file # \w\ +可以匹配任意的单词, 将其加上[]的标志
多个组合表达式,可以用 | 组合
cat file | sed 's/a/A/d' | sed 's/b/B/d'
引用
shell在调用其他命令时,先会扩展双引号中的内容,
如 text=hello; echo hello world | sed "s/$text/Hello/g"
awk 高级文本处理
调用模式:
awk 'BEGIN{ print “start” } pattern { commands } END { pringt "end" } ' file
以上有三个结构组成: BEGIN, END 和command , 在使用中可选,不一定全部出现
其是按行处理文件, 可放在单引号或双引号中进行分析
特殊变量:
NR: 当前行号
NF: 字段数量
1: 第一列的内容
(NF-1)表倒数第二列
-V 可以将外部值传递给awk
当输入的变量来自文件时,也可以: awk '{ print v1, v2 }' v1=var2 file
过滤模型:
awk 'NR < 5 ' # 行号小于5的行
awk 'NR ==1, NR==4' #行号1到5之间
awk '/linux/' #包含linux的行
awk '!/linux/' #不包括linux行
设置分割符号
-F awk -F: '{ print i ; }
替换
awk '{sub(/test/, "no", 2); print}' | awk '{ sub(/3/, "999", $3);print}' > new_renf90
压缩或解压缩JavaScript(了解即可)
JavaScript(其他语言类似)在写作过程中,为了可读性,我们都会加入一些空格和注释,但这些会增加代码文件的体积,拖慢网页的加载速度。为了加快,一般都会压缩JavaScript,会删除空白符和换行符实现(称为Minified JS)。当然这个过程也可以反过来,称为解压缩。shell中同样可以实现类似的功能。
cat and paste
cat可以按行来合并多个文件
paste则可以按列合并多个文件, eg paste file1 file2 -d "," #d 指定分割符号
tac以逆形式打印行
eg; seq 5 | tac
大批量替换
find . -name *.cpp -print0 | \ xargs -I { } -o sed -i 's/Copyright/Copeleft/g' { }
or
find . -name *.cpp -exec sed -i 's/Copyright/Copeleft/g' {} +
找到当前目录下的所有 .cpp文件,并使用 sed将Copyright改为Copeleft。
文本切片和参数操作
var="This is a line of text"
echo ${var/line/REPLACED}
将line替换成REPLACED
第五章
这章主要讲web,我使用较少,就主要记录自己使用的命令
下载软件(如BLUPF90)
wget URL1 URL2 URL3 。。。#简单实现多个下载
选项-t, 可以指定尝试下载的次数,如:
wget -t 5 URL # 尝试5次,这用于解决网络不稳定的问题, 但是如果设置为0,则会是不断重试,慎用
wegt --limit-rate 20k URL # 限制下载的速度
wegt -c URL #在下载完成以前中断,可以利用选项-c从断点接着下载
另外一个cURL,
curl URL
第六章
主要讲git和fossil仓储,使用更少,这里就跳过了。但是其中的Git讲解值得看看。
第七章
tar
归档文件。 将多个文件打包为单个文件,并且保留所有的文件原本属性
tar -cf outfile.tar file1 file2 file3.... ## 也可以, tar -cf *.txt
查看合并的文件
tar -tf outfile.tar
追加:
tar -rvf org.tar new_file
两个归档的文件合并:
tar -Af file1.tar file2.tar
进行查看: tar -tvf file1.tar
对归档的文件中的文件删除:
tar --delete --file file1.tar file1.txt
压缩tar归档文件
常见格式有:
gzip格式:file.tar.gz 或者file.tgz tar -z
bzip2格式: file.tar.bz2 tar -j
Lempel-Ziv-Markov格式: file.tar.lzma. tar --lzma
但是也可以使用-a,让tar自己根据扩展名自动选择压缩算法。
tar -acvf file.tar.gz file1 file2
排除部分文件:
tar -cf file.tar * --exclude "*.txt"
若排除为不同的类型文件,将其放在一个文件file4中
tar -cf file.tar * -X list # 配合X选项
cpio命令与tar类似,这里就不再写出
gzip
gzip 也是常用的压缩文件命令之一,gunzip是解压, 但两者都是对单个文件进行处理,应结合tar一起使用。
tar -cavvf file.tar.gz file1 file2.... ##-a 是指明根据文件拓展名推断压缩格式
另一种:
先 tar -cvvf file.tar file1 flile2....
再: gzip file.tar
如果有上百个文件时,则需要做个循环(-r)做逐个添加文件,
File_list="file1 file2 file3..."
for f in f
done
gzip file.tar
tar -xavvf file.tar.gz -c extract_directory #-a 自动检测压缩格式
zcat
可以直接读取gzip格式文件
压缩率
一共有9级,1级是压缩率最低,速度最快,9级则相反。
gzip -5 test # 这是压缩6级
bzip2可以有更高的压缩率,但是花费的时间比gzip更长
bzip2 filename #压缩
bunzip2 filename.bz2 #解压缩
也可以tar -xjvf filename.tar.bz2 # -j 识别bzip2格式
lzma则是优于前两个命令。
lzma filename
unlzma filename.lzma #解压
zip压缩
zip file.zip file1 file2...
unzip file.zip#解压
pbzip2
前面介绍的只能使用单核,但现在LINUX一般都是多个CPU,想要充分利用,加快速度
pbzip2 myfile.tar
rsync备份
rsync -av source_path destination_path # a表示归档操作, v表示打印出细节或进度
rsync -av source_dir username@host:PATH #将文件备份带服务器或主机上
路径反过来,也可以将数据传到本地。host是服务器的IP, PATH指定了路径。
但是主机要安装和运行着OpenSSH服务器。
通过网络传输时,对其进行压缩,会增加传输速度:
rsync -avz source destination #-z为压缩数据
整个目录内容的同步:
rsync -av /home/test/ /home/backups
fsarchiver
其可以创建全盘镜像。并且可以备份系统文件,
备份: fsarchiver savefs backup.fas /dev/sda1 /dev/sda2...
恢复: fsarchiver restfs backup.fsa id=0, dest=/dev/sda1
id=0是表明我们希望从备份归档中提取第一个分区的内容,将其恢复到dest指定的分区
如果多个: fsarchiver restfs backup.fsa id=0, dest=/dev/sda1 id=1, dest=/dev/sda2