Linux编辑命令使用:Vim、Sed、awk

发布于 2020-10-29  387 次阅读


Linux的shell下常用编辑与处理命令实践

(一)利用 vi 创建文档,在当前光标前插入文本、在当前行之下新开一行;在命令模式下,分别利用 r、R 替换光标所在的字符。

首先采用vi建立空白文档:

vim viText.txt

采用i:insert 在光标前插入,采用a:append 在光标后追加文本,实践使用如下文本内容:

 This is the text of vim
 we can inset the code into the front of word by 'i'

file

以光标放置在第一行的单词vim为例,在命令模式下,采用r实现单个字符替换:

file

采用R实现连续的字符替换:

file

(二)利用 vi 创建文档,输入若干行内容,输入命令以删除当前行及其后 n-1 行;删除光标开始处至行首;删除光标开始处至行尾。

将第一个内容的文本复制一个副本用于本题,并添加一定的新文本。

cp viText.txt viText2.txt

file

将光标置于第三行首,便于后续实践说明:

file

通过末行模式设置 set nu或是在vimrc配置中设置显示行号,随后可以在命令模式下,采用d5G命令删除本行到第5 (n-1) 行:

file

自往前删除直至第一行的命令为d1G:

file

采用如下命令首先撤销前一次更改,再实现删除光标开始处至行首:

:undo
d0

同样的,可以采用命令: d$实现删除光标所在处至行尾字符删除:

file

(三)利用 vi 创建文档,输入若干行内容,将当前行中所有字符串 “20191015”均用字符串“20201015”替代;从光标开始处向文件 尾搜索“Wuhan University” 。

继续复制已有的文档并采用vi追加和编辑新副本文档。

cp vi*2* viText3.txt

编辑后的文档如下:

file

目标字符串既有单独存在的字,也有与其他字符混合拼接组成的一个字,可用于测试搜索查找功能的能力强弱:

file

末行模式下,全文本替换字符串::3s/20191015/20201015/g

file

替换前十行::1,10s/20191015/20201015/g,可以发现第11行还是原样,达到了效果,同时底部显示了处理的行数等信息:

file

输入/ Wuhan University查询:

file

字符连接在一起也可以查出:
file

(四)awk 脚本的基本结构是什么?awk 的工作原理是什么?试用一个 例子加以说明。

基本结构:

awk 'BEGIN{print "start"} pattern {print "Go Go Python"}END{print "End here"}'

工作原理:

例子:

采用不同复杂程度的awk脚本代码作说明,保存脚本文件名为 awktest.sh

echo | awk 'BEGIN{i=0}{i++} {print "Go Go Python"}END{print i}'
echo --------------

echo -e "line2\nline3\nline4" | awk 'BEGIN{print "Go first"} {print}END{print "END"}'
echo --------------round

echo -e 5,8 | awk '{
        for(i=1;i<4;i++){
           if($1<$2) {print "xiao"}
           else{print "ilorge"}
 }}'
 echo -----------dictionary

 awk 'BEGIN{
       a["key1"]=23;a["key2"]=34;
    for(i in a) 
    {print i,a[i]}}'

 echo \n-----------Two dimission List

 echo | awk 'BEGIN{
    for(i=1;i<=9;i++){
        for(j=1;j<=9;j++)
             {tar[i,j] = i*j;
             print(i,"*",j,"=",tar[i,j]);
 }
 }

采用 `sh awktest.sh` 直接执行(此方式不需要赋予文件更高的权限),可查看到运行的结果:

file

(五) 现有系列坐标(3,3)、(4,5) 、(7,8),需要将这些坐标进行平移,平移量为(1.5,3.5),请在终端采用 echo 和 awk 进行实现。

echo在终端打印点位坐标`echo -e "3 3\n4 5\n7 8"`:

file

使用awk脚本处理数据`echo -e "3 3\n4 5\n7 8" | awk '{print 1+1.5,2+3.5}'`:

file

(六)利用 awk 实现打印文本的奇数行和偶数行(提示:采用 NR%==0 和 NR%==1)

利用上文的副本文档`viText3.txt`用于本题测试。

6.1 查看数据

通过awk查看文件数据及其行号: `awk '{print NR,$0}' vi3`

file

6.2 奇偶行输出

根据行号 `NR` 分别输出奇偶行:

awk '{if(NR%2==0) print NR,0}' vi*3*
awk '{if(NR%2==1) print NR,0}' vi*3*

file

6.3 混合输出

`awk '{if(NR%2==1) {print NR,0} else{print "--", NR,0}}' vi3`

file

(七)设计一个综合利用 vi、awk 及 sed 命令的操作实验,并具体实现

7.1 原始数据文件

原始数据构建,采用vi编辑文档如下:

file

7.2 设计目标与要求

现有一个带有多种复杂分隔符的文档数据,请按如下要求实现:
(1)必须用到 vi 、awk、sed 命令;
(2)将分隔符规范化简介化,形式自定,还原数据并输出结果为副本文件便于后续数据处理;
(2)统计每一行的:第1列与第2列的和;第4、5、6列的和;各列的平均值、;任意列的最大值。

7.3 编写综合处理脚本

sed  -e 's/]/ /g' composite.txt

file

(1)实验

  cp composite.txt composite2.txt
   sed -i 's#[##g' composite2.txt
   echo 1
   sed -i s/[//g composite2.txt
   sed -i 's#]##g' composite2.txt
   echo 2
   sed -i "s/'//g" composite2.txt
   echo 3
   awk '{print NR,"-", 0 ,2}' composite2.txt

  awk '{  
          sum1 = 0;
          sum2 = 0;
          sum3 = 0;
          for(i=1;i<=NR;i++){
                  sum1 = sum1 + $1;
                  sum2 = sum2 + $2;
          }
  print(sum1,sum2,sum3)

  }' composite2.txt

  awk '{print "----------------end------------"}'

file

可以发现不够用。

(2)最终结果

  1 cp composite.txt composite2.txt
  2 echo "\n-------source data-----------\n"
  3 awk '{print NR,NF," - ",0}' composite2.txt
  4 sed -i 's/,/ /g' composite2.txt
  5 sed -i 's/\[//g' composite2.txt
  6 sed -i 's/]//g' composite2.txt
  7 sed -i "s/'//g" composite2.txt
  8 echo "\n------------data filtering-----------\n"
  9 awk '{print NR,NF," -  ",0}' composite2.txt
 10 echo "\n-----------statistics-------------\n"
 11 awk 'BEGIN{max = 0}{  
 12         print(NR,NF," - ",0," | ",2+3,4+5+6)
 13         sum1 += 1;
 14         sum2 +=2;
 15         sum3 += 3;
 16         sum3 +=4;
 17         sum5 += 5;
 18         sum6 +=6;
 19         if(2>max){
 20         max =2;
 21         }
 22 
 23 }'END'{print NR+1,NF," - ",$1+1,sum2/NR,sum3/NR,sum4/NR,sum5/NR,sum6/NR," | max values of column2:",max}' composite2.t    xt
 24 
 25 
 26 echo "----------------End------------"
 27 echo "@ by GanAHE"
 28 exit 1

file
file

采用vim composite2.txt命令查看处理后的副本文件效果如下:
file

总结

通过以上几题练习与实践,能够有效加深对Linux下shell脚本命令的认识,并且能够实现对一些现实应用场景需求的处理,比如数据清洗、数据统计等。