Linux学习笔记(三)

文本处理工具

  • grep行过滤工具,用于根据关键字进行行过滤:grep [选项] '关键字' 文件名。例如:grep --color=auto 'root' passwd。简写命令,可以先执行:alias grep='grep --color=auto'(当前会话有效,要想全局并且让所有用户都生效,将此命令追加到文件/etc/bashrc末尾,然后执行命令:source /etc/bashrc立即生效),以后每次不用添加高亮选项:--color=auto
  • 常见选项:
-i:不区分大小写(grep -ni 'root' passwd)
-v:查找不包含指定内容的行,反向选择(grep -nv 'root' passwd)
-w:按单词搜索(grep -nw 'hello' passwd)(精确匹配)
-o:打印匹配关键字(grep -no 'root' passwd)
-c:统计匹配到的次数(grep -c 'hello' passwd)
-n:显示行号(grep -n 'root' passwd)
-r:逐层遍历目录查找
-A:显示匹配行及后面多少行(grep -nA 3 '^ftp' passwd)
-B:显示匹配行及前面多少行(grep -nB 3 '^ftp' passwd)
-C:显示匹配行前后多少行(grep -nC 3 '^ftp' passwd)
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e:使用正则匹配
-E:使用扩展正则匹配
^key:以关键字开头(grep -n '^root' passwd)
key$:以关键字结尾(grep -n 'bash$' passwd)
^$:匹配空行(grep -n '^$' passwd )
--color=auto:可以将找到的关键词部分加上颜色显示
  • cut是列截取工具,用于列的截取:cut [选项] 文件名。例如:cut -d: -f1,7 passwd | head
  • 常见选项:
-c:以字符为单位进行分割,截取(cut -c1-5 passwd,第1列至第5列,cut -c1,5 passwd,截取第1列和第5列)
-d:自定义分隔符,必须是单个字符,默认为制表符(\t)(cut -d: -f1,7 passwd)
-f:与(-d)一起使用,指定截取哪个区域
  • 过滤查看系统的运行级别:
runlevel | cut -c3
runlevel | cut -d ' ' -f2
  • sort是用于排序的工具。它将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将它们按升序输出。
  • 常用选项:
-u:去除重复行(sort -u 3.txt)
-r:降序排列,默认是升序(sort -nr -t: -k3 1.txt,按用户的uid进行降序排序)
-o:将排序结果输出到文件中,类似重定向符号(>)(sort -nr -t: -k3 1.txt -o 2.txt)
-n:以数字排序,默认是按字符排序(sort -n -t: -k3 1.txt)
-t:分隔符
-k:第N列
-b:忽略前导空格
-R:随机排序,每次运行的结果均不同(sort -uR 3.txt)
  • uniq是用于去除连续的重复行的工具。例如:uniq 3.txt
  • 常见选项:
-i:忽略大小写
-c:统计重复行次数(uniq -c 3.txt )
-d:只显示重复行(uniq -cd 3.txt )
  • tee是从标准输入读取并写入到标准输和文件的工具,即:双向覆盖重定向(屏幕输出 | 文本输入)。选项:-a(双向追加重定向)。例如:echo hello world | tee 4.txt(默认覆盖文件中的所有内容)。echo 666 | tee -a 4.txt(向4.txt文件末尾追加字符串666)。
  • diff是用于逐行比较文件不同的工具:diff [选项] 文件1 文件2。注意:diff描述两个文件不同的方式是告诉我们怎么改变第一个文件之后与第二个文件匹配。
  • 常用选项:
-b:不检查空格
-B:不检查空白行
-i:不检查大小写
-w:忽略所有的空格
--normal:正常格式显示(默认)
-c:上下文格式显示
-u:合并格式显示
  • 准备2个文件:file1和file2。
  • file1:
1   aaaa
2   111
3   hello world
4   222
5   333
6   bbb
  • file2:
1   aaa
2   hello
3   111
4   222
5   bbb
6   333
7   world
  • 模式1:diff file1 file2,正常格式显示(默认),file1如何改变才能和file2匹配。
1c1,2 (第一个文件的第1行需要改变(c=change)才能和第二个文件的第1到第2行匹配)
< aaaa(小于号"<"表示左边文件(file1)的文件内容)
---(分隔符)
> aaa(大于号">"表示右边文件(file2)的文件内容)
> hello
3d3(第一个文件的第3行删除(d=delete)后才能和第二个文件的第3行匹配)
< hello world
5d4(第一个文件的第5行删除(d=delete)后才能和第二个文件的第4行匹配)
< 333
6a6,7(第一个文件的第6行添加(a=add)内容后才能和第二个文件的第6到7行匹配)
> 333(需要添加的内容在第二个文件里是333和world)
> world
  • 模式2:diff -c file1 file2,上下文格式显示。
(前2行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号***表示file1,---表示file2)
*** file1   2020-10-21 10:17:05.343714964 +0800
--- file2   2020-10-21 10:16:27.112637692 +0800
***************(分隔符)
*** 1,6 ****(以***开头表示file1文件,1,6表示1到6行)
! aaaa("!"表示该行需要修改才能与第二个文件匹配)
  111
- hello world("-"表示需要删除该行才能与第二个文件匹配)
  222
- 333("-"表示需要删除该行才能与第二个文件匹配)
  bbb
--- 1,7 ----(以---开头表示file2文件,1,7表示1到7行)
! aaa(表示第一个文件需要修改才能与第二个文件匹配)
! hello(表示第一个文件需要修改才能与第二个文件匹配)
  111
  222
  bbb
+ 333(表示第一个文件需要添加该行才能与第二个文件匹配)
+ world(表示第一个文件需要添加该行才能与第二个文件匹配)
  • 模式3:diff -u file1 file2,合并格式显示。
(前2行主要列出需要比较的文件名和文件的时间戳;文件名前面的符号---表示file1,+++表示file2)
--- file1   2020-10-21 10:17:05.343714964 +0800
+++ file2   2020-10-21 10:16:27.112637692 +0800
@@ -1,6 +1,7 @@("-1,6"表示第一个文件的1至6行)
-aaaa("-"表示需要删除该行)
+aaa("+"表示需要添加该行)
+hello
 111
-hello world
 222
-333
 bbb
+333
+world
  • 比较两个目录的不同:diff dir1 dir2,默认情况下会比较两个目录里相同文件的内容。若只需要比较两个目录里文件的不同,不需要进一步比较文件内容,需要加-q选项:diff -q dir1 dir2
[root@localhost tmp]# ll -R dir*
dir1:
总用量 0
-rw-r--r--. 1 root root 0 10月 21 11:15 file1
-rw-r--r--. 1 root root 0 10月 21 11:15 file2
-rw-r--r--. 1 root root 0 10月 21 11:15 file3
-rw-r--r--. 1 root root 0 10月 21 11:15 file4
-rw-r--r--. 1 root root 0 10月 21 11:15 file5

dir2:
总用量 0
-rw-r--r--. 1 root root 0 10月 21 11:15 file1
-rw-r--r--. 1 root root 0 10月 21 11:15 file2
-rw-r--r--. 1 root root 0 10月 21 11:15 file3
-rw-r--r--. 1 root root 0 10月 21 11:15 test1
-rw-r--r--. 1 root root 0 10月 21 11:15 test2
[root@localhost tmp]# diff -q dir1 dir2
只在 dir1 存在:file4
只在 dir1 存在:file5
只在 dir2 存在:test1
只在 dir2 存在:test2
  • 小技巧:有时需要以一个文件为标准,去修改其他文件,并且修改的地方比较多,此时可通过打补丁的方式来完成。
1)先找出文件不同,然后输出到一个文件中
[root@localhost tmp]# diff -uN file1 fille2 > file.patch
-u:合并格式显示
-N:将不存在的文件当作空文件
2)将不同内容打补丁到文件1
[root@localhost tmp]# patch file1 file.patch
[root@localhost tmp]# diff file1 file2
[root@localhost tmp]#(没有内容说明两个文件内容一致)
  • paste是用于合并文件行的工具。
  • 常用选项:-d:自定义间隔符,默认是tab。-s:串行处理,非并行。
[root@localhost tmp]# cat -n file1
     1  hello world
     2  888
[root@localhost tmp]# cat -n file2
     1  zhang san
     2  999
     3  ooo
[root@localhost tmp]# paste file1 file2
hello world zhang san
888 999
    ooo
[root@localhost tmp]# cat -n file2(所有工具都不会修改原文件的内容)
     1  zhang san
     2  999
     3  ooo
[root@localhost tmp]# paste -d: file1 file2(以冒号":"分隔)
hello world:zhang san
888:999
:ooo
[root@localhost tmp]# paste -s file1 file2
hello world 888(将第一个文件每行内容依次排列,中间默认用tab分隔)
zhang san   999 ooo(将第二个文件每行内容依次排列,中间默认用tab分隔)
  • tr是用于字符转换,替换和删除的工具,主要用于删除文件中控制字符或进行字符转换。
  • 用法1:命令的执行结果交给tr处理(其中string1用于查询,string2用于转换处理,注意:原文件中的内容不会被改变,并且其会对查询字符串中每个字符进行匹配,以下同理):commands | tr 'string1' 'string2'
  • 用法2:tr处理的内容来自文件,注意要使用<标准输入:tr 'string1' 'string2' < filename
  • 用法3:匹配 string1 进行相应的操作,如删除操作:tr [选项] 'string1' < filename
  • 常用选项:
-d:删除字符串1中每个字符
-s:删除所有重复出现字符序列,只保留第一个,即将重复出现的字符串压缩为一个字符串
  • 常匹配的字符串:
字符串 含义
a-z或[:lower:] 匹配所有小写字母
A-Z或[:upper:] 匹配所有大写字母
0-9或[:digit:] 匹配所有数字
[:alnum:] 匹配所有字母和数字
[:alpha:] 匹配所有字母
[:blank:] 匹配所有水平空格
[:punct:] 匹配所有标点符号
[:space:] 匹配水平或垂直空格
[:cntrl:] 匹配所有控制字符(\f\n\r\t
[root@localhost tmp]# cat 1.txt 
root:x:0:0:root:/root:/bin/bash
[root@localhost tmp]# tr 'a-z' 'A-Z' < 1.txt(将文件中所有的小写字母替换为大写字母)
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
[root@localhost tmp]# tr -d 'a-z' < 1.txt (删除文件中所有的小写字母)
::0:0::/://
[root@localhost tmp]# cat 1.txt 
aaabsdsdsdaaabbbbbbc
[root@localhost tmp]# tr -s 'a-z' < 1.txt(匹配所有的小写字母并将重复的子串压缩为一个字符)
absdsdsdabc
  • 查看当前主机中某张网卡的ip:ifconfig ens32
  • 常用的快捷键(^表示ctrlCommand键):
^c:终止前台运行的程序
^z:将前台运行的程序挂到后台
^d:退出(等价exit)
^l:清屏
^a或home:光标移到命令行的最前端
^e或end:光标移到命令行的最后端
^u:删除光标前所有字符
^k:删除光标后所有字符
^r:搜索历史命令(常用快捷键!)
  • 常用的通配符
*:匹配0或多个任意字符
?:匹配任意单个字符
[list]:匹配list中的任意单个字符
[!list]:匹配除list中的任意单个字符
{string1,string2,...}:匹配string1,string2或更多字符串
  • bash中的引号:①双引号(""):会把引号的内容当成整体来看待,允许通过$符号引用其他变量值;②单引号(''):会把引号的内同当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通符号。③反撇号(``):反撇号和$()一样,里面的命令会优先执行,若存在嵌套,则反撇号不能使用。
[root@localhost tmp]# date +%F
2020-10-21
[root@localhost tmp]# echo "$(date +%F)"
2020-10-21
[root@localhost tmp]# echo '$(date +%F)'
$(date +%F)
[root@localhost tmp]# echo "`date +%F`"
2020-10-21
[root@localhost tmp]# echo $(echo "`date +%F`")
2020-10-21
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258