Linux常用文本命令 字符处理命令 发表于 2022-08-08 | 分类于 Linux | 暂无评论 ### grep sed awk cut tr wc uniq sort ## grep 命令 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。 ### grep常用参数: ```shell -B num : 除了显示符合样式的那一行之外,并显示该行之前的num行内容。before -A num :除了显示符合样式的那一行之外,并显示该行之前的num行内容。after -C num:除了显示符合样式的那一行之外,并显示该行之前后num行内容。 -c :计算符合样式的列数 -d 动作: 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。 -e :实现多个选项间的逻辑or关系. -n :在显示符合样式的那一行之前,标出该行的列数编号,即显示行号; -E :使用扩展的正则表达式 \egrep。 -i :忽略字符大小写的差别。 -o :只显示匹配的字符串部分。 -v :显示不包含匹配文本的所有行。 -V :显示版本信息 -s :不显示错误信息。 ``` ## sed 命令 1.sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。 2.sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下: ```shell 首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。 sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。 sed把每一行都存在临时缓冲区中,在缓冲区中对这个副本进行编辑,将处理后的行输出到屏幕上,但不会修改原文件,除非使用-i参数。 ``` 3.sed可以对文件进行过滤,也可以进行修改。 4.sed是一种语言,awk是一种语言,bash也是一种语言。 5.sed是对文本一行一行进行处理的,若不加地址定界,或地址定界匹配不带,则默认会一行一行的匹配处理文本内容,直到结束。 ### sed用法: sed [option] 'script' inputfile.... ```shell [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:将替换成功的行保存至文件中。 ``` ## awk 命令 文本报告生成器,逐行处理。 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。 awk允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。 ### awk命令样式及工作流程 ```shell 工作流程#awk 'BEGIN{action} /pattern/{action} END{action}' filename 读输入文件之前执行的代码段(由BEGIN关键字标识)。 主循环执行输入文件的代码段。(执行完BEGIN后,开始读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。) 读输入文件之后的代码段(由END关键字标识)。 ``` awk常见使用方式: ```shell #awk -F"分隔符" '/pattern/{action}' filename ``` 练习 ```shell 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... ```shell [option] -c或--bytes或--chars 只显示Bytes数,字节数。 -l或--lines 只显示行数。 -w或--words 只显示单词数。 --help 在线帮助。 --version 显示版本信息。 ``` ## sort 命令 作用:用于将文本文件内容,以行为单位,加以排序。 sort 命令不加任何参数时,将以默认的方式将文本文件的第一列以ASCII 码的次序排列,并将结果输出到标准输出。 格式:#sort [option] 文件 ```shell [option]: -n: 将数值按照从小到大顺序排序。。 -r :以相反的顺序来排序。 -t :指定分隔符,分割列;如-t " ",指定空格为分隔符。配合-k参数 -k : 指定列 -o <输出文件>:将排序后的结果存入指定的文件。 ``` ## uniq 命令 用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用,即去重,如...sort|uniq uniq不加参数,默认是删除文本中重复的行。 当重复的行并不相邻时,uniq 命令是不起作用的。 格式:#uniq [OPTION]... [INPUT [O UTPUT]] ```shell [opion] -c或--count :在每列旁边显示该行重复出现的次数。 -d或--repeated: 仅显示重复出现的行。 -u或--unique 仅显示不重复出现行列。 [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据; [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。 ``` ## cut 命令 作用:将行按指定的分隔符分割成多列。它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的去重功能。 cut命令主要是接受三个定位方法: ```shell 第一,字节(bytes),用选项-b 第二,字符(characters),用选项-c 第三,域(fields),用选项-f 注意:英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符(根据编码而定)。 注意:按字节或字符分割时将不能指定-d,因为-d是划分字段的。 ``` 格式:#cut OPTION... [FILE]... ```shell [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] ```shell [option] -c: 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换。要求字符集为ASCII。 -s :删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。 -d :删除字符串1中所有输入字符。 ``` SET字符集 ```shell 指定字符串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:] :所有水平与垂直空格符 ``` 实例练习 ```shell 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 -n5.去掉搜索引擎统计的页面,并统计去掉后的访问次数①#awk '{print $12,$1}' access.log|grep ^\"Mozilla|awk '{print $2}'|sort |uniq|wc -l6.查看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 -l7.查看访问次数前十的IP地址①#awk '{print $1}'|sort |uniq -c|sort -nr|head -n10 ``` 转载自: >https://www.cnblogs.com/gk888/p/15474577.html