Linux常用文本命令:grep、sed、awk 、cut、tr、wc、uniq、sort

 


grep

grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。

grep常用参数:

-B num  : 除了显示符合样式的那一行之外,并显示该行之前的num行内容。before
-A num :除了显示符合样式的那一行之外,并显示该行之前的num行内容。after
-C num:除了显示符合样式的那一行之外,并显示该行之前后num行内容。
-c :计算符合样式的列数
-d 动作: 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e :实现多个选项间的逻辑or关系.
-n :在显示符合样式的那一行之前,标出该行的列数编号,即显示行号;
-E :使用扩展的正则表达式  \egrep。
-i :忽略字符大小写的差别。
-o :只显示匹配的字符串部分。
-v :显示不包含匹配文本的所有行。
-V :显示版本信息
-s :不显示错误信息。

练习:

1.选取出"ip a"命令的ipv4地址
# ip a|grep  "\<inet\>"|grep -E -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"

 


 

sed

 

前言:

1.sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

2.sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:
首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。
sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
sed把每一行都存在临时缓冲区中,在缓冲区中对这个副本进行编辑,将处理后的行输出到屏幕上,但不会修改原文件,除非使用-i参数。

3.sed可以对文件进行过滤,也可以进行修改。

4.sed是一种语言,awk是一种语言,bash也是一种语言。
5.sed是对文本一行一行进行处理的,若不加地址定界,或地址定界匹配不带,则默认会一行一行的匹配处理文本内容,直到结束。
 
sed用法:
#sed  [option]   'script'   inputfile....
[option]常用选项:
    -n:不输出模式空间内容到屏幕,即不自动打印。
    -e:多点编辑。
    -f  /path/script_file:从指定的文件中读取编辑脚本。
    -r:支持使用扩展正则表达式。
    -i.bak:备份原文件,备份后在原文件处进行内容修改。(-i.bak是因为sed命令使用-i参数时不会询问,怕改错,有一定的危险性,因此-i.bak是在修改前先备份原文件,然后再修改该文件,一定程度上减少了出错风险。)

'script''地址命令':sed自身的语言脚本。
    'script'='地址定界 + 编辑命令',若不加地址定界,则默认处理文本中的所有行。
    '地址定界:
        ①不给地址,则对全文进行处理。
        ②单地址:
            #  :指定的行;    $  :最后一行。
            /pattern/    :搜索文本中包含"pattern"的所有行。
        ③地址范围(哪行到哪行)[#代表行号,/pat/代表比包含有pat的首行]:
            #,#
            #,+#
            /pat1/,/pat2/
            #,/pat1/~:步进
            1~2:奇数行
            2~2:偶数行
    编辑命令':
        d:删除模式空间匹配的行,并立即进行下一轮循环。
        p:打印当前模式空间内容,追加到默认输出之后。
        a[\]text:在指定文本/行的后面追加text内容。(在该行的下一行追加文本),支持使用"\n"实现多行追加。[\]只是方便辨别,实际命令中并不使用它,只需"a内容"或a\内容。
        i[\]text:在指定文本/行前插入text内容。(在该行的上一行插入文本)。[]只是方便辨别,实际命令中并不使用它,只需"i内容"即可,或便于区分可i\text。
        c[\]text:替换单行或多行为text内容,c内容,或c\内容。
        w /path/somefile:保存模式匹配的行到指定文件中。
        r /path/somefile:读取指定文件的内容,至模式空间中匹配到的行的后面。
        =:为模式空间中的行打印行号。
        !:为模式空间中匹配行取反处理。

  'sed工具'
    's///':查找替换,支持使用其他分隔符,s@@@,s%%%
    替换标记:
      g:行内全部替换
      p:显示替换成功的行
      w /path/to/somefile:将替换成功的行保存至文件中。

练习:原文本内容:

[root@localhost gaokai]# cat test.sh 
function look() {
    echo "this is a test4335"
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa

--------------------------------------------
1.打印1,2行模式空间的内容,并追加到默认输出后。
# sed  '1,2p' test.sh
function look() {
function look() {
    echo "this is a test4335"
    echo "this is a test4335"
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa
--------------------------------------------
2.打印1,2行模式空间处理后的内容,不打印原模式空间内容,并输出
# sed  -n '1,2p' test.sh
function look() {
    echo "this is a test4335"
---------------------------------------------
3.不打印模式空间内容,然后将匹配到的行输出到屏幕上。
# sed -n '/func/,/awd/p' test.sh 
function look() {
    echo "this is a test4335"
}
awdadAWDAaaw97979879722aaa
----------------------------------------------
4.在第3行行尾添加文本"()_______m",并显示
# sed  '3a()_______m' test.sh 
function look() {
    echo "this is a test4335"
()_______m
}
awdadAWDAaaw97979879722aaa
awdadAWDAaaw97979879722aaa
----------------------------------------------
5.在第1行前追加文本"_______m",并保存后在原处进行编辑。

   # sed -i.bak '1i_______m' test.sh
   # cat test.sh
  _______m
  function look() {
  echo "this is a test4335"
  awdadAWDAaaw97979879722aaa
  awdadAWDAaaw97979879722aaa

-----------------------------------------------
6.删除第2行
# sed '2d' test.sh

  echo "this is a test4335"
  awdadAWDAaaw97979879722aaa
  awdadAWDAaaw97979879722aaa

  -----------------------------------------------
7.更换第1,3行内容为"this is tihuan",并输出
# sed '1,3cthis is tihuan' test.sh

   this is tihuan
   awdadAWDAaaw97979879722aaa

------------------------------------------------
8.在第1至3行后追加"zhui.txt"文本内容,并显示
#cat zhui.txt
----------
----------
#sed '1,3r zhui.txt' test.sh

   function look() {
   ----------
   ----------
   echo "this is a test4335"
   ----------
   ----------
   awdadAWDAaaw97979879722aaa
   ----------
   ----------
   awdadAWDAaaw97979879722aaa

   -----------------------------------------------

  9.替换行内内容,将单词"is"替换为大写"IS"

  #sed  's/\<is\>/IS/' test.sh

    function look() {
    echo "this IS a test4335"
    awdadAWDAaaw97979879722aaa
    awdadAWDAaaw97979879722aaa

   -----------------------------------------------

   10.将/etc/default/grub文件中以"号结尾的行的冒号,替换为xyz"。

  # sed -r 's/("$)/xyz\1/' /etc/default/grub

 


 

awk

 

文本报告生成器,逐行处理。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
 
awk命令样式及工作流程
工作流程
#awk 'BEGIN{action} /pattern/{action} END{action}' filename
  • 读输入文件之前执行的代码段(由BEGIN关键字标识)。
  • 主循环执行输入文件的代码段。(执行完BEGIN后,开始读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。)
  • 读输入文件之后的代码段(由END关键字标识)。

如图

 

 

 awk常见使用方式:

#awk   -F"分隔符"   '/pattern/{action}'    filename

练习

1.以":"Wie分隔符,提取/etc/passwd文件的第一列
#awk  -F":"  '{print $1}'  /etc/passwd

2.只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割。
#awk  -F":"  '{print $1"\t"$7}' /etc/passwd |sed -n '1,2p'

3.显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以"+"分割。
#awk  -F":"  '{print $1"+"$7}' /etc/passwd|sed  -n '1,2p'

4.显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行之前添加行其中列名为name,shell,在最后一行添加"blue,/bin/nosh"。
#cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}' 

5.搜索/etc/passwd以root单词开头的行,并显示该行的用户名和bash(以空格为分隔符)。
# awk -F":" '/^root\>/{print $1" "$7}'  /etc/passwd

 


 

wc命令

利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。

格式:#wc [option] file1...
[option]
    -c或--bytes或--chars 只显示Bytes数,字节数。
    -l或--lines 只显示行数。
    -w或--words 只显示单词数。
    --help 在线帮助。
    --version 显示版本信息。

 


 

sort命令

 

作用:用于将文本文件内容,以行为单位,加以排序
sort 命令不加任何参数时,将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。

格式:#sort [option] 文件
[option]:
     -n: 将数值按照从小到大顺序排序。。
     -r :以相反的顺序来排序。
    -t :指定分隔符,分割列;如-t " ",指定空格为分隔符。配合-k参数
    -k : 指定列
   -o <输出文件>:将排序后的结果存入指定的文件。

 


uniq

用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用,即去重,如...sort|uniq

uniq不加参数,默认是删除文本中重复的行
当重复的行并不相邻时,uniq 命令是不起作用的。
格式:#uniq [OPTION]... [INPUT [O UTPUT]]
[opion]
    -c或--count :在每列旁边显示该行重复出现的次数。
    -d或--repeated: 仅显示重复出现的行。
    -u或--unique 仅显示不重复出现行列。
    [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
    [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

 


 cut

作用:将行按指定的分隔符分割成多列。它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的去重功能。

cut命令主要是接受三个定位方法:
    第一,字节(bytes),用选项-b
    第二,字符(characters),用选项-c
    第三,域(fields),用选项-f
注意:英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符(根据编码而定)。
注意:按字节或字符分割时将不能指定-d,因为-d是划分字段的。
格式:#cut OPTION... [FILE]...
[option]
    -b:按字节筛选;
    -n:与"-b"选项连用,表示禁止将字节分割开来操作(一般情况下不用,防止-b将多字节的字符强行分割导致乱码);
    -c:按字符筛选;
    -d:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。
    -f:与-d一起使用,以指定的分隔符为单位,选择显示的列号。
    --complement:显示出去-f指定的列的其他列(即显示-f的补集)。
    --output-delimiter:指定输出分割符;默认为输入分隔符。
注意:cut分隔符必须是单个字符。

 


 

tr

tr命令:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。
tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要使用两个字符串:字符串1用于查询,字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
格式:#tr  [OPTION]... SET1 [SET2]
[option]
    -c: 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换。要求字符集为ASCII。
    -s :删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
    -d :删除字符串1中所有输入字符。

SET字符集

指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
CHAR1-CHAR2 :字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
[:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:lower:] :所有小写字母
[:upper:] :所有大写字母
[:digit:] :所有数字
[:xdigit:] :所有 16 进位制的数字

[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:graph:] :所有可打印的字符(不包含空格符)
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符

练习

1.将test.sh中的is替换为IS,并追加到a.txt文件中。
# cat test.sh|tr "is" "IS"  >a.txt

2.将test中的小写字母转换为大写字母,并追加到a.txt文件中。
# cat test.sh|tr [a-z] [A-Z] >a.txt

注意:不能追加到原文件中,否则原文件会被清空。

 


 
 实例练习(下方的整块都是关于上述命令的练习)
 
1.查看access.log文件有多少个IP访问:
①#awk '{print $1}' access.log|sort|uniq|wc -l

2.查看某一个页面被访问的次数
①#grep "index.php" access.log|wc -l

3.查看每一个IP访问了多少个页面,并按访问次数从小到大排序
①#awk '{++S[$1]} END {for (a in S) print a,S[a]}' accsess.log |sort -n -t " "  -k 2
②#awk '{print $1}' access.log|sort|uniq -c|sort  -n 

4.查看某个IP访问了哪些页面,并进行统计,页面访问次数从小到大排序。
①#awk '{print $1,$7}' access.log|grep 192.168.24.1|sort|uniq -c |sort -n

5.去掉搜索引擎统计的页面,并统计去掉后的访问次数
①#awk '{print $12,$1}' access.log|grep ^\"Mozilla|awk '{print $2}'|sort |uniq|wc -l

6.查看2021年10月27日时这一个小时有多少IP访问。
①#awk '{print $4,$1}' access.log|grep '27/Oct/2021:05'|wc -l
②#awk '{print $4,$1}' access.log|grep '27/Oct/2021:05'|awk '{print $2}'|sort |uniq |wc -l

7.查看访问次数前十的IP地址
①#awk '{print $1}'|sort |uniq -c|sort -nr|head -n10

 

 
 
 
 

 

posted @ 2021-10-28 17:41  浮~生  阅读(1161)  评论(0编辑  收藏  举报