Shell笔记系列四

touch

用来生成空白文件或是修改已有文件的时间戳,-d用于指定特定的时间和日期。

[root@localhost test]# touch hello.txt
[root@localhost test]# ls
hello.txt
[root@localhost test]# touch -d "Fri Jun 25 20:50:14 IST 2018" TEST.TXT

ln

为某个文件或者目录在另一个位置创建一个同步的链接。链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。建立硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建立指向目录的硬链接。而对符号链接,则不存在这个问题。默认情况下,ln产生硬链接。给ln命令加上- s选项,则建立符号链接。

ln -s target symbolic_link_name

[root@localhost test]# ln -s /var/www/ ~/web
lrwxrwxrwx. 1 root root    8 10月 20 21:16 web -> /var/www

注:使用dd命令创建iso文件 

dd if=/dev/cdrom of=image.iso

diff

实现文件的查找并修补文件的差异。diff -u 是一体化输出,其中+起始的是新加入的行,-起始的是被删除的行。

[root@localhost test]# cat i.txt
this is a test text
1
2
3

[root@localhost test]# cat I.txt
this is a test txt
2
3
4

[root@localhost test]# diff -u i.txt I.txt
--- i.txt       2018-12-11 21:02:52.307280907 +0800
+++ I.txt       2018-12-11 21:03:12.503434416 +0800
@@ -1,5 +1,5 @@
-this is a test text
-1
+this is a test txt
 2
 3
+4
 

patch

使用patch命令来进行修补。

[root@localhost test]# diff -u i.txt I.txt > i.patch
[root@localhost test]# patch -p1 i.txt < i.patch
patching file i.txt
[root@localhost test]# cat i.txt
this is a test txt
2
3
4

[root@localhost test]# 

head

查看文章的一小部分内容,也有可能是文件的前n行或后n行

[root@localhost test]# head -n 2 i.txt
this is a test txt
2

打印除了最后M行之外的所有行

[root@localhost test]# head -n -3 i.txt 
this is a test txt
2

tail

打印文件的后面指定的行数;同时tail命令常用的是见识一个内容不断增加的文件中出现的新行,为了能够监视文件的增长,tail有一个特殊的选项-f或--follow,允许tail关注文件内容的更新并将其显示出来。也可以指定特定进程,来决定tail命令的终止。

[root@localhost test]# tail -f /var/log/messages
Dec 11 21:26:12 localhost NetworkManager[670]: <info>  [1544534772.0154] dhcp4 (ens33):   nameserver '192.168.192.2'
Dec 11 21:26:12 localhost NetworkManager[670]: <info>  [1544534772.0155] dhcp4 (ens33):   domain name 'localdomain'

wc

用于统计文件的行数,单词数,字符数。

[root@localhost test]# wc i.txt
 5  8 26 i.txt
[root@localhost test]# wc -w i.txt
8 i.txt
[root@localhost test]# wc -c i.txt
26 i.txt

grep

正则表达式是用来进行模式匹配处理文本的。正则表达式有3种,位置标记,标识符,数量修饰符。

位置标记:

^ 指定匹配正则表达式的文本必须起始于字符串的首部

$指定匹配正则表达式的文本必须结束语字符串的尾部

标识符:

A字符:匹配特定的字符

.:匹配任意一个字符

[]:匹配括号内的任意一个字符

[^]:匹配不在括号内的任意一个字符

数量修饰符:

?:匹配之前的项1次或0次

+:匹配之前的项一次或多次

*:匹配之前的项0次或多次

{n}:匹配之前的项n次

{n,}:匹配之前的项至少n次

{n,m}:匹配之前的项最小n次,最大m次

在文本中搜索特定模式的文本行

[root@localhost test]# grep a i.txt
this is a test txt

grep命令默认使用基础正则表达式,选项-E,可以使grep使用扩展正则表达式,也可以使用egrep命令:

[root@localhost test]# grep -E "[a-z0-9]+@[a-z0-9]+\.[a-z]+" i.txt      
123456@qq.com

-o 可以只输出匹配到的文本,-v可以打印出不匹配match_pattern的所有行,-c能够统计出匹配模式的文本行数,-n可以打印匹配字符串所在的行数

递归搜索多个文件

[root@localhost ~]# grep "text" . -R -n
./web/out.html:4: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
./web/out.html:8: <style type="text/css">

-i选项可以匹配模式时,不考虑字符的大小写,-e可以指定多个匹配模式,-f可以读取文件并使用其中的模式。

[root@localhost ~]# grep i.txt -R -n -i
.bash_history:939:vim i.txt
.bash_history:940:vim I.txt
.bash_history:942:diff i.txt I.txt

cut

使用cut按列切分文件,能够提取指定位置或列之间的字符,可以指定每列的分隔符,在cut中,没列被称为一个字段。默认制表符是字段的分隔符,对于没有分隔符的行,会将该行按照原样打印出来,使用-s选项可以禁止打印出这些行。

[root@localhost test]# cut -s -f 1,2 a.txt
1       2
4       5
7       8

默认制表符是分隔符,当然也可以使用-d设置分隔符,

[root@localhost test]# cut -f 2,3 -d "," A.txt
2,3
5,6
8,9

如果没法根据字段的位置来提取值,则可以根据字符位置提取,cut命令可以根据字节或者字符来指定选择范围,也可以将字段指定为某个范围内的字节,字符,字段: -b字节,-c字符,-f定义字段

[root@localhost test]# cut -c 1-3 a.txt
1       2
4       5
7       8

sed

sed是流编辑器的缩写,常用用法是进行文本替换,sed可以使用另一个字符串来替换匹配模式,模式可以是简单的字符串或正则表达式。

sed 's/pattern/replace_string/' file

[root@localhost test]# sed 's/,/./' A.txt
1.2,3
4.5,6
7.8,9

注意:替换只是替换了每行中模式首次匹配的内容,如果想进行全局替换,则可以使用/g,也可以使用/#g标记可以使sed替换第N次出现的匹配。

[root@localhost test]# sed 's/,/./g' A.txt   
1.2.3
4.5.6
7.8.9

 sed命令会将s之后的字符视为命令分隔符

[root@localhost test]# sed 's,[0-9],a,g' A.txt
a,a,a
a,a,a
a,a,a

直接删除空行,/d告诉sed不进行替换工作,而是直接删除匹配的空行。

[root@localhost test]# cat a.txt
1       2       3
4       5       6

7       8       9
[root@localhost test]# sed '/^$/d' a.txt
1       2       3
4       5       6
7       8       9

如果将文件名传递为sed,它会将文件内容输出到stdout,但是文件内容没有变化,我们如果想直接在文件中进行替换,则可以使用-i选项

[root@localhost test]# sed '/^$/d' -i a.txt 
[root@localhost test]# cat a.txt
1       2       3
4       5       6
7       8       9

也可以使用-e来组合来组合多个模式,也可以使用管道

awk

awk命令可以处理数据流,支持关联数组,递归函数,条件语句。awk的脚本结构如下:

awk "BEGIN{ print "start" } pattern {commands} END {print "end"}' file

awk脚本通常由3部分组成:BEGIN,END和带模式匹配选项的公共语句块,这三个部分都是可选的,可以不用出现在脚本中。

[root@localhost test]# awk "BEGIN {i=0} {i++} END {print i}" i.txt 
5

awk的工作方式:

⑴首先执行BEGIN{command}语句块中的语句,这里的语句可以是变量初始化,打印输出,这是一个可选的语句块;

⑵接着从文件或stdin中读取一行,如果能够匹配pattern,则执行随后的command语句块,重复这个过程,直至文件全部被读取完毕,这个语句同样也是可选的,如果不提供,则默认执行{print},即打印所读取到的每一行

⑶读读取至输入流末尾时,执行END{command}语句块,这个也是可选的。

注意,如果没有提供模式,则awk就认为所有的行都是匹配的。

[root@localhost test]# echo -e "liu\nddddd" | awk 'BEGIN {print "START"} {print} END {print "END"}'  
START
liu
ddddd
END

awk命令是一个解释器,它能够解释并执行程序,和shell一样,它包括一些特殊变量

......

 

 

内容参考《Linux Shell脚本攻略》

 

 

 

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-21 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
one_t:硕还是本?什么岗
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务