shell 练习题 --传参路径文件名,传出这个文件多少行
方法一:wc -l ./nowcoder.txt | awk '{print $1}'
-----------------------------------------------------------------------------
思路: 由于 wc -l 路径文件名存在行数和文件名
在后面加上管道符号 | awk '{print $1}' ,将管道符前面的内容当成一个数组,打印出第一个$1
-----------------------------------------------------------------------------
学习内容:1)wc 文件名 相当于 wc -clw 文件名
-c:字节数 -l:行数 -w:单词数
同时看到三个文件相关内容:wc 文件名1 文件名2 文件名3
2) | :管道符是一个很神奇的工具,它可以很轻易的将两个毫不相关的程序,把一个程序的结果交给另一个来处理,甚至,不停的交接处理。
例子 : ps –ef |grep python
此处ps查看进程 -e显示所有的进程,-f全格式显示;grep高效的查询工具,可以查询文本中带有关键字的行,此处翻译:查看此时带有python关键字的进程。由于在工作中我们不需要查看所有的进程,所以再查询使用一下,比如想看ssh服务是否启动,就可以使用 ps -ef|grep ssh
练习:1、将issue_lianxi文件中的内容转换为大写后保存至~/2.txt文件中
这道题的几个关键点,首先是获取 issue_lianxi 文件的内容,使用cat;其次是转换成大写,使用tr [a-z] [A-Z]来实现最后我们重定向保存到文件即可:cat issue_lianxi | tr 'a-z' 'A-Z' >2.txt
2、将当前系统登录用户的信息转换为大写后保存至3.txt文件中
who | tr 'a-z' 'A-Z' >3.txt
当前系统登录用户信息使用who来表示,使用|连接,将其转换成大写重定向保存为3.txt
3、一个linux用户给root发邮件,要求邮件标题为 help ,邮件正文如下: {Hello, I am 用户名,The system version is here,please help me to check it ,thanks!}
分析过程:要发给root用户这个语句以及当前版本的信息(uname -a),其中要换行使用\n,如下:
echo -e 'Hello, I am '$USER',The system version is here,please help me to check it ,thanks!\n' "uname -a"
echo -e会对后面的\n进行解释,不然只会当成字符处理。字符要加单引号,避免出现问题。¥USER不能加引号,\n必须在引号里,uname -a是个命令,所以要加反引号``。后面进行邮件处理,格式:mail -s '邮件标题' 收件人 内容,这边我们通过管道将内容传输过去
echo -e 'Hello, I am '$USER',The system version is here,please help me to check it ,thanks!\n' `uname -a` | mail -s 'help' root
4、计算1+2+3+..+99+100的总和
在linux中可以使用 1..100表示1到100,中间使用空格分开,使用echo {1..100} 就可以将其表示出来,这个时候使用tr ' ' ' +' 将空格转换,得到从1加到100,将内容通过管道输入计算器得出结果。
3) 在Linux中有三剑客
1、grep 更适合单纯的查找或匹配文本,查找和匹配的格式参数有多种多样,需要的时候自行搜索
2、sed 更适合编辑匹配到的文本
sed在处理文本时是逐行读取文本内容,读到匹配的行就根据匹配指令做操作,不匹配就跳过。
可以对文本进行增删改查等操作。
使用方法:
1)在命令行指定sed指令对文本进行处理:sed+选项 ’指令‘ 文件
2)先将sed指令保存到文件中,将该文件作为参数进行调用:sed +选项 -f 包含sed指令的文件 文件
常用选项:
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容(sed '3ahello' 1.txt #向第三行后面添加hello)
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
=:用来打印被匹配的行的行号
n:读取下一行,遇到n时会自动跳入下一行
r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件
3、 awk 更适合格式化文本,对文本进行复杂格式处理
awk:在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息之后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息。一般的使用方法主要是命令,这次不讨论插入脚本调用之说。
格式: awk [-Field-separator] 'commands' input-file(s)
此处input-file是要被awk操作的文件,里面的内容通过-F 分隔符将其分割成各个域,每个域使用$域值来表示,比如说第一块域:$1,使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域.这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔,因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件各域使用冒号作为分隔符,则必须使用-F选项: awk -F : 'commands' input-file
例子: awk '{print $0}' temp.txt > sav.txt
表示打印所有域并把结果重定向到sav.txt中
awk '{print $0}' temp.txt|tee sav.txt
和上例相似,不同的是将在屏幕上显示出来
这里只做简单的例子,详细的信息在后面使用到再了解
4)tee 用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单地说就是把数据重定向到给定文件和屏幕。
使用方法:和管道|一起使用 :
1、cat 1.txt | tee 2.txt
将1.txt文件内容重定向保存在2.txt同时屏幕展示。
2、cat 1.txt | tee -a 2.txt (-a 选项强制 tee 命令追加信息到文件。)
将1.txt文件内容重定向以追加的方式保存在2.txt同时屏幕展示。
3、cat 1.txt | tee 2.txt 3.txt 4.txt
将1.txt文件内容重定向保存在2.txt、3.txt、4.txt同时屏幕展示。
4、cat 1.txt | tee 2.txt | wc -l
将1.txt文件内容重定向保存在2.txt同时屏幕展示,可以作为下一个管道的输入内容
5、:w !sudo tee %
假如你使用 Vim 编辑器 打开文件,并且做了很多更改,然后当你尝试保存修改时,你得到一个报错,让你意识到那是一个 root 所拥有的文件,这意味着你需要使用 sudo 权限保存修改。这个脚本需要你输入密码,输入即可。
-----------------------------------------------------------------------------
方法二:awk '{print NR}' ./nowcoder.txt |tail -n1
-----------------------------------------------------------------------------
思路:awk '{print NR}' ./nowcoder.txt 打印文件的所有行号
tail -n1 截取行数为倒数第一个数据
---------------------------------------
知识点:tail
tail -n查看文件的后n行 文件名
tail -f file:该命令特别有用,可以一直显示追加到文件后面的内容
-----------------------------------------------------------------------------
方法三:$ awk 'END{print NR}' ./nowcoder.txt
awk 本身就可以打印最后一行的数据
-----------------------------------------------------------------------------
方法四:$ grep -c \n ./nowcoder.txt
grep -c 统计文件中某字符串的个数 ,此处统计 ""的个数,就是行数
-----------------------------------------------------------------------------
方法四:$ sed -n '$=' nowcoder.txt
sed 的方法