文本操作:awk,grep,sed,paste,cat,diff,wc,vi
last
用于显示用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把该给文件的内容记录的登入系统的用户名单全部显示出来。
/etc/passwd配置文件存放用户名、home目录、默认执行脚本程序等。
cat/etc/passwd显示文件内容,将输出结果通过管道传递给cut命令。
awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
命令行方式调用awk
awk[-F field-separator] ‘commands’ input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,1表示第一个域,n表示第n个域。默认域分隔符是"空白键"或"[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
总结一下awk的使用格式,分为四个部分,之间用空格分开:
awk[-F field-separator] ‘{pattern + action}’input-file(s)
-F ':'和-F:':'是一样的。-F:和没有是一样的。
搜索/etc/passwd有root关键字的所有行
$awk -F:'/root/' /etc/passwd说明支持正则表达式
root:x:0:0:root:/root:/bin/bash
$ awk'/^root/' /etc/passwd说明支持正则表达式
root:x:0:0:root:/root:/bin/bash
这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
$ awk -F:'/root/' /etc/passwd说明pattern 和 action可以一起用
/bin/bash
grep
常用格式为:grep [选项] ”模式“ [文件],单引号双引号无都可以。
grep家族总共有三个:grep,egrep,fgrep。
[选项]主要包括:
-c:只输出匹配行的计数。
-i:不区分大小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求。
[ -]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
.:所有的单个字符。
*:有字符,长度可以为0。
grep ‘test’d*
显示所有以d开头的文件中包含 test的行。
grep ‘test’aa bb cc
显示在aa,bb,cc文件中匹配test的行。
grep‘[a-z]\’ aa(这里的正则表达式\和perl不同)
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
grep '^a'test.txt搜索以a开头的
linux的grep命令,解释一下perl正则表达式在这里怎么用?
grep -P 'perl正则表达式'files如:
$ grep -P'abc|okm' test1.txt
abc
okm
注意:‘ ’就是左右边界符
sed
http://www.jb51.net/article/111306.htm
删除行
地址范围:m,n表示第m行到第n行;m,$ 表示对m行以及其后面的所有行。可以结合正则表达式。d表示删除。注意:sed不会改变原文件。
新增行
在后面添加行
在前面添加行
替换行
替换部分字符串而不是整行
$ sed's/aa/AA/' test2.txt将行中第一个aa->AA
$ sed's/aa/AA/g' test2.txt将行中每一个aa->AA,g表示全局替换
同样可以使用地址限定,如:$ sed '6,7s/aa/AA/g' test2.txt
也支持使用正则表达式限定符合条件的行,如:$ sed '/^[0-9]/s/aa/AA/g' test2.txt
搜索并输出行内容
加上 -n 选项让sed仅仅是输出经过处理之后的那些行
$ sed -n '2p'test2.txt
22 bb
将修改应用到文件中
区别与之前没有改变原文件的内容,我们可以使用 -i 选项告诉sed直接修改文件的内容,而不是将修改结果输出到终端上。如:
$ sed -i '2,3d'test2.txt
$ cat test2.txt
11 aa
23 dd
55 2e
66 AAff ccaa
66 aaff ccaa
sed中常用的正则元字符
sed中正则的语法可能与其他命令的正则语法有一些不同
$表示行尾
^表示行首
[a-z0-9]表示字符范围
[^]表示除了字符集中的字符以外的字符
sed的正则中 \(\) 和 \ 需要转义
.表示任意字符
*表示零个或者多个
\+一次或多次
\?零次或一次
\|表示或语法
paste
paste可以简单的理解为把两个文件的内容按列合并,与cat命令直接将不同文件按照先后顺序接起来不同,paste可以非常快速的将两个文件中的内容按照文件顺序从左往右排起来。
拼接时使用指定符号隔开各个文件的内容:paste -d':' file1 file2,-d之后使用双引号和单引号甚至不用引号的结果一样,而且只能指定一个字符。
删除所有换行符:paste file1 -s,paste file1 file2 -s,paste file1 -s -d:
指定从标准输入中读取的次数:
用空格隔开,一次读三个,完了换行继续读。
cat
1.仅查看文件内容:$ cat file1
2.与grep连用来查找文件中的内容(直接用grep也可以做到):
$cat file1 | grep "b"
3.创建文件
$cat > file4
……
没文件创建文件;有文件先清空再写。
4.清空文件内容
$cat > file4
5.向文件的尾部写入内容
$ cat >> file4
6.注意:有些时候可能会利用cat命令生成一些Shell 脚本文件。这个时候如果直接写符号,有可能被认为是调用变量,导致无法写入文件。答案是需要在符号前面加 \ 。
diff
在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
语法:diff [options] FILES
FILES的格式:FILE1FILE2;DIR1 DIR2; FILE DIR; DIR FILE
1.比较两个文件
$ diff txt3txt4
3c3
---
8c8
---
10a11,12
a -add
c - change
d - delete
2.并排格式输出
$ diff txt3txt4 -y -W 50
2013-01 2013-01
2013-02 2013-02
2013-03 | 2014-03
2013-04 2013-04
2013-05 2013-05
2013-06 2013-06
2013-07 2013-07
2013-08 | 2013-07
2013-09 2013-09
2013-10 2013-10
“|”表示前后2个文件内容有不同
“
“>”表示后面文件比前面文件多了1行内容
wc
该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
格式:wc [选项]文件...
-c统计字节数。
-l统计行数。
-m统计字符数。这个标志不能与 -c 标志一起使用。
-w统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L打印最长行的长度。
vi
vim编辑器是系统自带的文本编辑器,按"i”,切换到“插入”状态。
关于退出:ESC+ 冒号(:)+ 命令 + 回车
wq ——保存退出
q ——正常退出(在内容上没有被改动过)
q! ——不保存退出
领取专属 10元无门槛券
私享最新 技术干货