编辑完保存退出的四种方式
1. Esc+:+wq+回车(w是write,q是quit)
2. Esc+:+x+回车(x=wq)
3. Esc+shift+zz
4. Esc+ZZ(在大写开启下)
虽然我更喜欢awk和sed,但是如果能把这几个命令能活用的话一般的文本编辑就不在话下了,而且这几个命令更简单方便一点,但是功能相比awk和sed稍差一点。
一、cut命令
二、paste命令
三、sort命令
四、uniq命令
Linux之打印一个日志文件的第10行
这是一道来自leetcode shell练习的一道题。
一个
file.txt
下有如下内容,请设计一个bash
打印这个文件中的第十行。line 1 line 2 line 3 line 4 line 5 line 6 line 7 line 8 line 9 line 10 line 11 line 12
由这个问题,我们可以引出
Linux
三剑客:sed、grep、awk。1. sed 命令
sed
是一个非交互性文本流编辑器,全称为stream editor
。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed
命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。在Linux中,我们常用
sed
命令利用脚本来处理文本文件。其基本用法如下:
sed [-hnV][-e<script>][-f<script文件>][文本文件] -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或--help 显示帮助。 -n或--quiet或--silent 仅显示script处理后的结果。 -V或--version 显示版本信息。 a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 d :删除 i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行) p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
可见对于我们的需求,只需调用一句:
sed -n 10p file.txt
其中
-n
表示仅显示处理后的结果,10p
表示打印第10行。当然,如果想打印第3-5行的内容,就直接改写命令如下:
sed -n 3,5p file.txt
如果你想新增一行内容:
hello, world!
到第3行下:sed -e 3a\hello,world! file.txt
删除
d
同理。事实上,上面提到的增删操作都没有改变原有文件。但i
参数不一样,它会修改原来的文件内容。例如我们想在最后一行加入# happy ending!
:sed -i '$a # happy ending!' file.txt
其中
$
表示最后一行,a
表示新增动作。查看文件如下:line 1 line 2 line 3 line 4 line 5 line 6 line 7 line 8 line 9 line 10 line 11 line 12 # happy ending!
2. grep 命令
grep
是global search regular expression and print out the line
的简写,翻译过来为全局正则查找字符串并打印,不是全球牛瘟根除计划。不得不承认命名也是有大智慧…其同样适用于查找文件里符合条件的字符串。
grep
指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。基本用法:
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
参数比较多,我们看点实际例子。
比如你想查看某个日志文件的记录,并通过时间进行匹配:
grep -n '2020-11-22 01:23:45' *.log
从文件内容查找与正则表达式匹配的行:
grep –e "正则表达式" fileName
查找匹配的行数:
grep -c "被查找的字符串" fileName
其实它和
find
命令可以结合起来用,例如我们想从根目录开始查找所有扩展名为 .log 的文本文件,并找出包含 “ERROR” 的行:find / -type f -name "*.log" | xargs grep "ERROR"
这里简单介绍一下
xargs
指令。xargs
指令从标准数据流中构造并执行一行行的指令。其从输入流获取字符串,然后利用空白、换行符等切割字符串,在这些字符串的基础上构造指令,最后一行行执行这些指令。假设现在我们有x.txt, y.txt, z.txt
3个文件,现在我需要同时对3个文件重命名,即在名字前加一个前缀pre
,那么一行命令就直接搞定:ls | xargs -I name mv name pre_name
-I
参数是查找替换符,name
替代ls
找到的结果。好,现在回归正题。我们如何使用
xargsgrep
来查找文件某一行呢?grep -n "" file.txt | grep -w '10' | cut -d: -f2
-n
标记出该行的编号,然后通过查找关键字符’10’,并通过cut
进行剪切。其中cut -d:
表示以:
为分隔符,-f2
表示显示第2个区域。3. awk 命令
awk
是一种处理文本文件的语言,是一个强大的文本分析工具。
awk
这个名字看起来就很奇怪,实际上是取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。总之
awk
命令应用十分广泛。直接看语法:awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
awk
有自己的特殊变量集合,例如$number
表示记录的字段,FS
表示字段分隔符,NF
表示当前记录的字段数量,NR
表示当前记录编号。先看一些简单的例子:
awk '{print$1}' file.txt
每行按照空格或
Tab
分割,输出文本中的第一项:line line line line line line line line line line line line #
来个稍微复杂一点的。比如我们想过滤第二列大于5的文本:
awk '$2>5 {print $0}' file.txt ####### line 6 line 7 line 8 line 9 line 10 line 11 line 12
还可以设置变量:
awk -va=-1 '{print $2,$(a+1)}' file.txt ####### line line 1 line line 2 line line 3 line line 4 line line 5 line line 6 line line 7 line line 8 line line 9 line line 10 line line 11 line line 12 #######
其中
$0
表示选取整行字符。言归正传,如何使用
awk
打印第10行呢?那就要用到之前所说的特殊变量NR
:awk 'NR==10' file.txt
看到这就两个字:清爽!
最后的最后
上面讲了3个文本处理的命令,那么它们的优势、或者说适用范围是怎样的呢?综合来看:
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
所以具体问题具体分析。
最后,我们再来看看我们的问题。不就是显示第10行嘛:
head -10 file.txt | tail -1
tail -10 file.txt | head -1
此刻,是否已经无语凝噎。。。当然没有,谁告诉你文本文件有10行的,加个判断?
cnt=`cat file.txt | wc -l`
out=`head -10 file.txt | tail -1`
if [ $cnt -lt 10 ]
then
echo ""
else
echo $out
fi
众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑、存储。故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如。今天,就写下几个关于Linux下一些常用的文本处理命令。
1、文本文件查看命令:cat、more、less、head、tail
1.1 cat命令:连接并显示,当文本文件有多个时,将其连接并一个一个的完整地显示出来
eg:
cat /etc/inittab
cat /etc/fstab
cat /etc/inittab /etc/fstab
cat主要有三大功能:
1.一次显示整个文件。# cat filename
2.从键盘创建一个文件。# cat > filename
只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件: # cat file1 file2 > file
cat命令的常用参数:
cat -n 或 --number 由 1 开始对所有输出的行数编号
cat -E 显示文本文件的行结束符
Linux的行结束符为$,而windows的行结束符为$+回车,
故在Linux上编辑的文本文件在windows中显示,都是只有一行
cat命令,以ctrl+c结束 、运行在bash之上;
1.2 文件查看之分屏显示:more、less、head、tail
more命令:more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读。more命令从前向后读取文件,因此在启动时就加载整个文件。
严格来说more命令只能实现"向后翻页",因为要想实现"往前翻页",当前光标必须是不在文件的尾部
空格键 space(向后一屏)
b键 back (向前一屏)
回车 (向后一行)
/ (搜寻字串)
less命令:less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。
在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。 less 在查看之前不会加载整个文件
空格键 space(向后一屏)
b键 back (向前一屏)
回车 (向后一行)
/ (搜寻字串)
pgup (向上一页)
pgdn (向下一页)
/ (搜寻字串)
? (搜寻字串)
head命令:head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
查看文件的前n行,默认前10行
-n num:前num行
tail命令:tail 命令从指定点开始将文件写到标准输出.
-n num:查看文件尾部后num行
-f:查看文件尾部、不退出、等待显示后续追加至此文件的新内容
使用tail命令的-f选项可以方便的查阅正在改变的日志文件
tail -f filename会把filename里最尾部的内容显示在屏幕上
并且不断刷新,使你看到最新的文件内容.
三大利器:(必须会)
sed(文本处理类)、awk(文本处理类)、grap(文本查找类)
2、文本处理相关的命令:cut(剪切)、join(合并)、sed、awk
2.1 cut命令:详细内容,可以看我的博客:文本处理类命令之cut命令详解
-d:指定字段分隔符,默认是空格
-f:指定要显示的字段,
-f 1
-f 1,3(显示第1和第3个属性值,离散表示法)
-f 1-3(显示第1到第3个属性值,连续表示法)
2.2 文本排序命令:sort、uniq文本排序:
sort(并不影响原文件中的内容,只是影响显示内容,相当于视图,默认升序,ASCII)
-n(按照数字大小排序,而非默认的ASCII码)
-r(逆序排列,可以和-n一起使用)
-t(字段分隔符)
-k(以哪个字段为关键字排序)
-u(排序后相同的行,只显示一次)
-f(排序时,忽略字符大小写)
关于sort命令的详解:请看我的博客——Linux下的文本排序命令之sort命令详解
uniq (报告和忽略重复的行),什么是重复的行:内容一致,互为相邻
-d:只显示重复的行
-D:
-c:显示文件中行重复的次数
uniq命令的功能是去掉文件中重复行输出。(不改变原文件)
uniq --help 可查看命令参数使用方法。
uniq file1 显示file1中内容,重复行只显示一次。
uniq -c file1 显示file1中内容,重复行只显示一次。在每行前面列出本行在文件中出现几次。
uniq -d file1 只显示file1中重复出现的行,且重复行只显示一次。
uniq -D file1 只显示file1中重复出现的行,且重复行全部显示。
uniq -f 2 file1 忽略每行前两个词,显示file1中内容,重复行只显示一次。
uniq -i file1 忽略大小,显示file1中内容,重复行只显示一次。
uniq -s 5 file1 忽略每行前5个字母,显示file1中内容,重复行只显示一次。
uniq -u file1 只显示file1中不重复的行。
uniq -w 5 file1 只比较每行前5个字母,显示file1中内容,重复的只显示一次。
2.3 文本统计命令之wc命令
文本统计:
wc:(统计一个文本中的:行数,单词数,字符数)
wc /etc/fstab
wc -l /etc/fstab统计行数
wc -w /etc/fstab统计单词数
wc -c /etc/fstab统计字节数
wc -m /etc/fstab统计字符数
wc -L /etc/fstab显示最长的一行包含多少个字符
2.4 字符处理命令之tr命令
字符处理命令:
tr:转换或删除字符
tr [OPTION]... SET1 [SET2]
SET表示字符集
如:tr ab AB
一个一个字符比较
-d 删除字符集中出现的所有字符,只需要给定一个字符集即可
详细请看我的博客:Linux下的字符处理命令之tr命令详解
Linux下常见的文本处理命令的归纳总结:
1、文本文件查看命令:cat、more、less、head、tail
2、文本处理相关的命令:cut(剪切)、join(合并)、sed、awk
3、文本排序命令:sort、uniq
4、文本统计命令之wc命令
5、字符处理命令之tr命令
转载于:https://blog.51cto.com/xxaqwqm/1557387
编辑完保存退出的四种方式
1. Esc+:+wq+回车(w是write,q是quit)2. Esc+:+x+回车(x=wq)
3. Esc+shift+zz
4. Esc+ZZ(在大写开启下)
转载于:https://www.cnblogs.com/canhun/p/11056429.html