Shell_3


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

你可能感兴趣的:(Shell_3)