https://www.cnblogs.com/LO-gin/p/6882490.html

流编辑器:sed

语法:sed [-hnV][-e<script>][-f<script文件>][文本文件]

1、参数:

  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息。
  • -i 直接编辑原文件,在原文件中操作

例子:
sed -i 's/原字符串/新字符串/' file   #原文件中仅替换每行首次匹配到的原字符串,若一行有多个该字符串,只有第一个被替换(1行只替换1次)
sed -i 's/原字符串/新字符串/g' file     #在原文件中替换,后缀 g 意味着会替换每一处匹配,而不是每一行中第一次匹配

sed  's/原字符串/新字符串/g' file     #不加 -i 参数,将替换后的文本都打印出来,但原文件不变

sed  's/原字符串/新字符串/g' file > newfile    #同上,替换后的文本打印到新文件中

sed -i '/^$/d' file   #在原文件中移除空白行,^$表示空白行,d表示将匹配的样式移除,注意:由空格组成的行不能算空白行

sed -i 's/max_execution_time = 30/max_execution_time = 300/g'  /etc/php/php.ini    #修改php配置文件的配置

sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl ./`    #整个目录下全局搜索替换
sed -i "s/test/newstr/g" `grep test -rl ./myfile`    #将当前myfile目录下所有文件中所有的test字符串全部替换为newstr字符串

文本混乱与恢复正常(替换空格,换行符,制表符等)
cat test.js | sed 's/;/;\n/g; s/{/{\n\n/g; s/}/\n\n}/g'        # s/;/;\n/g将;替换为\n; s/{/{\n\n/g将{替换为{\n\n s/}/\n\n/g将}替换为\n\n}
cat test.js | sed 's/;/;\n/g' |sed 's/{/{\n\n/g' | sed 's/}/\n\n}/g'   #同上
sed 's/ [^.]*mobbile phones[^.]*\.//g' test.txt      #移除文件test.txt中包含单词“mobile phones”的句子

sed -i 's/,/./g' test.log     #将test.csv源文件中所有 , 换成 .

sed -i 's/[\t]/,/g' test.log  #将test.log源文件中所有tab符号换成,

2、动作:
  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :替换, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :替换(匹配局部替换),可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

新增 a

sed -i '1i\insert_to_first_line_msg' a.txt  #在a.txt原文件首行插入’insert_to_first_lline_msg‘作为新的首行

sed -i '1i\test' test.txt    #将新的字符串插入第一行之前作为第一行

sed -i '2a testContent' test.txt     #在第 2 行后面新增一行内容

sed -i '1,3a testContent' test.txt   #在原文的第 1~3 行后面各新增一行内容

sed -i '$a This is a test' test.txt   #在文件末尾加一行 This is a test,$表示最后一行

sed -e '4 a newline' test.txt   #在4行之后新增一行

sed -e '4 a newline\nnewline2' test.txt  #在4行之后新增两行,\n 表示换行,增加3行同理,加上\n接上内容

替换 c

sed -i '2c testContent' test.txt     #将第 2 行内容整行替换

sed -i '1,3c testContent' test.txt   #将第 1~3 行内容替换成一行指定内容

删除 d

sed -i '/teststr/d' file.txt   #删除file.txt文件中包含"teststr"的行

sed -i '2d' test.txt     #删除第 2 行

sed -i '1,3d' test.txt   #删除第1~3行

sed -i 's/^ *//' test.txt  #删除行首空格

sed -i 's/^[[:space:]]*//' test.txt   #去掉test.txt中每行行首的制表符和空格

sed -i 's/^[0-9]* *//' test.txt   #去掉test.txt每行行首的数字

插入 i

sed '2i testContent' test.txt     #在第 2 行前面插入一行内容

sed '1,3i testContent' test.txt   #在原文的第 1~3 行前面各插入一行内容

打印 p

sed '2p' test.txt          #重复打印第 2 行

sed '1,3p' test.txt        #重复打印第1~3行

sed -n '2p' test.txt       #只打印第 2 行

sed -n '1,3p' test.txt     #只打印第 1~3 行

sed -n '/user/p' test.txt  #打印匹配到user的行,类似grep

sed -n '/user/!p' test.txt  #!!!反选,打印没有匹配到user的行

sed -n 's/old/new/gp' test  #只打印匹配替换的行

sed -n '1~2p' test.txt   #打印奇数行

sed -n '2~2p' test.txt   #打印偶数行

sed -n 'p;n' test.txt #打印奇数行

sed -n 'n;p' test.txt    #打印偶数行

替换 s

sed -i 's/old/new/' test.txt      #匹配每一行的第一个old替换为new

sed 's/[ ][ ]*/ /g' test.txt  #替换两个或多个空格为一个空格

sed 's/[ ][ ]*/:/g' test.txt  # 替换两个或多个空格为分隔符:

sed 's/[[:space:]][[:space:]]*/ /g'  test.txt   #如果空格与tab共存时替换成空格
sed 's/[[:space:]][[:space:]]*/:/g'  test.txt   #如果空格与tab共存时替换成分隔符:

sed -i 's/old/new/gi' test.txt    #匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写

sed -i '3,9s/old/new/gi' test.txt #匹配第 3~9 行所有old替换为new

数据流工具:awk

语法

awk [选项参数] 'script' var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项参数:

  • -F fs or --field-separator fs
    指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
  • -v var=value or --asign var=value
    赋值一个用户定义变量。
  • -f scripfile or --file scriptfile
    从脚本文件中读取awk命令。
  • -mf nnn and -mr nnn
    对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
  • -W compact or --compat, -W traditional or --traditional
    在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
  • -W copyleft or --copyleft, -W copyright or --copyright
    打印简短的版权信息。
  • -W help or --help, -W usage or --usage
    打印全部awk选项和每个选项的简短说明。
  • -W lint or --lint
    打印不能向传统unix平台移植的结构的警告。
  • -W lint-old or --lint-old
    打印关于不能向传统unix平台移植的结构的警告。
  • -W posix
    打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
  • -W re-interval or --re-inerval
    允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
  • -W source program-text or --source program-text
    使用program-text作为源代码,可与-f命令混用。
  • -W version or --version
    打印bug报告信息的版本。

工作方式:

awk 'BEGIN{ PRINT "start" } pattern { commands } END{print "END" } file

首先执行BEGIN语句块,然后从文件或stdin中读取一行,然后执行pattern{ commands }。直到文件全部读取完毕。读到输入流末尾时,执行END{ commands } 语句块。三个语句块都是可选的。如果没有提供pattern语句块则默认打印每一个读取到行。

awk的特殊变量:
NR:表示记录数量,在执行过程中对应于当前行号。
NF:表示字段数量,在执行过程中相对于当前行的字段数。
$NF:表示当前行的最后一个字段。$(NF-1)表示当前行的倒数第二个字段。依次类推
$0:这个变量包含执行过程中当前行的文本内容。
$1:这个变量包含第一个字段的文本内容。
$2:这个变量包含第二个字段的文本内容。依次类推。

FNR :与NR类似,不过多文件记录不递增,每个文件都从1开始
\t:制表符
\n :换行符
FS:BEGIN时定义分隔符
RS:输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ :匹配,与==相比不是精确比较
!~:不匹配,不精确比较
==:等于,必须全部相等,精确比较
!= :不等于,精确比较
&&:逻辑与
||:逻辑或
+:匹配时表示1个或1个以上
/[0-9][0-9]+/ :两个或两个以上数字
/[0-9][0-9]*/ :一个或一个以上数字
FILENAME:文件名
OFS:输出字段分隔符, 默认也是空格,可以改为制表符等
ORS :输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]':定义三个分隔符
 
例子:

awk 'BEGIN { i=0 } { i++ } END{ print i }' filename    #逐行读取文件并打印行数
echo -e "line1\nline2" | awk 'BEGIN{ print "Start" } { print } END { print "END" } '
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"-"var2"-"var3;}'
echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" | awk '{ print "Line no:"NR",No of fields:"NF, "$0="$0,"$1="$1,"$2="$2,"$3="$3 }'
awk '{ print $3,$2 }' file   #打印文件中每一行的第2和第3个字段。
awk 'END{ print NR }' file   #统计文件中的行数,只加END语句块表示文件执行到最后一行时再输出行号
awk 'NR < 5' file          #打印文件中行号小于5的行
awk 'NR==2,NR==5' file    #打印文件中行号在2到5之间的行
awk '/linux/' file        #打印文件中包含样式linux的行(样式可以使用正则表达式)
awk '1/linux/' file        #打印文件中不包含包含样式linux的行
awk -F: '{ print $NF }' /etc/passwd #读取并打印/etc/passwd文件的内容,设置定界符为":",默认的定界符为空格
var1='test'; var2='text'                #(1)外部变量
echo | awk '{ print v1,v2 } v1=$var1 v2=var2     #(2)打印多个从标准输入传给awk的外部变量
awk '{ print v1,v2 }' v1=$var1 v2=var2 filename #(3)输入来自文件
cat test.txt | getline output             #将cat的输出读入变量output中。
awk 'BEGIN { FS=":" } { print $NF }' /etc/passwd #BEGIN语句块中则使用FS="delimiter"设置输出字段的定界符
awk '{arr[$1]+=1 }END{for(i in arr){print arr[i]"\t"i}}' FILE_NAME | sort -rn    #统计每个单词的出现频率并排序
seq 5 | awk 'BEGIN{ sum=0;print "Summation:" } { print $1"+"; sum+=$1 } END{ print "=="; print sum }'    #将每一行第一个字段的值按照给定形式进行累加
echo | awk '{ "grep root /etc/passwd" | getline cmdout; print cmdout }'    #通过getline将外部shell命令的输出读入变量cmdout。变量cmdout包括命令grep root /etc/passwdde 的输出,然后打印包含root的行。

awk中使用循环与awk的内建函数
for(i=0;i<10;i++){ print $i; } 或者 for( i in array ) { print array[i]; }
length(string):返回字符串的长度
index(string ,search_string):返回search_string在字符串中出现的位置。
split(string, array, delimiter):用界定符生成一个字符串列表,并将该列表存入数组
substr(string, start-position, end-position):在字符串中用字符起止偏移量生成子串,并返回该子串。
sub(regex, replacement_str, string):将正则表达式匹配到的第一处内容替换成replacement_str。
gsub(regex, replacement_str, string):将正则表达式匹配到的所有内容替换成replacement_str。
match(regex ,string):检查正则表达式是不能够匹配字符串,若能,返回非0值;否则,返回0.

cat access.log | awk '{ if($9=200) print $7;}'     #分析nginx访问日志,awk不加 -f 参数表示使用空格(默认的分词字符)拆分该行,$9表示第9个字段(也就是HTTP CODE),$7表示第7个字段,表示用户访问的文件

awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10   #分析access.log获得访问前10位的ip地址

awk -F '[,:]' '{if($6==140) print $0;}' test.log   #对test.log中每行用“,”和“:”分割,并打印出分割后第6个字段等于140的行

cat *_login.log | awk -F[,:] '{if($24<1541260800) print $24;}' | wc -l   #统计所有login日志中时间戳(拆分后第24个字段)小于1541260800的行数

awk -F"," '{if(substr($3,1,7)=="2023-02") print $0}' test.csv   #打印test.csv文件中第三列的前7个字符为"2023-02"的行

awk -F"," -v m=${month} '{if(substr($3,1,7)==m) print $0}' test.csv > ./test_${month}.csv  #同上,筛选出匹配变量值得行并打印到新文件

awk -F: '{print $15}' test.log | awk -F, '{print $1}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}'   #对test.log的json行先用“:”分割再用“,”分割,再对某个字段累加

awk -F, '{print $14}' test.log | awk -F: '{print $2}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}'   #对test.log的json行先用“,”分割再用“:”分割再对某个字段累加

awk -F '[,:]' '{print $28}' test.log | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}'   #对test.log的json行分别用“,”和“:”分割后再对某个字段累加

awk -F[:,] '{print $28;}' pay.log | awk -F\" '{print $2;}' | awk '{for(i=0;i<NF;i++) sum+=$i;}END{print sum}'    #作用同上,在拆分后字段还包含双引号的情况下,再次拆分,获取数字再累加

for i in `ls`; do mv -f $i `echo $i | awk -F [_.] '{print $3"_"$2"_"$1"."$4}'`; done   #批量从命名文件,将格式 test_11001_201903011212.log 重命名为 201903011212_11001_test.log 格式

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

文件:test.log 内如如下:

{"sid":1,"cid":1,"channel":140,"zid":0,"uid":"140524293334","role_id":"100252","goods_id":7,"cny":110000,"eventtime":1540244075}

{"sid":1,"cid":1,"channel":140,"zid":0,"uid":"140524293334","role_id":"100252","goods_id":7,"cny":120000,"eventtime":1540244075}

命令:

awk -F ':' '{print $9}' test.log | awk -F ',' '{print $1}'    #先使用 “:”为分隔符分割test.log每一行,然后获取第9个字段,再用“,”为分隔符分割字符串,再取第一个字段。

结果:

110000

120000

若是要统计该字段的累加数:

awk -F ':' '{print $9}' test.log | awk -F ',' '{print $1}' | awk '{for(i=1;i<=NF;i++) sum+=$i;} END{print sum}'

结果:

230000

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

替换工具:tr

语法

tr [-cdst][--help][--version][第一字符集][第二字符集]
tr [OPTION]…SET1[SET2]

参数:

  • -c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
  • -d, --delete:删除指令字符
  • -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
  • -t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
  • --help:显示程序用法信息
  • --version:显示程序本身的版本信息

例子:

echo 12345 | tr '0-9' '9876543210' #加密
echo 87654 | tr '9876543210' '0-9' #解密
echo "Hello 123 world 456" | tr -d '0-9' #使用-d将stdin中的数字删除并打印出来
cat test.txt | tr -d '0-9' #同上
echo "hello 1 char 2 next 3 " | tr -d -c '0-9 \n' #参数-c是使用补集。删除stdin中的所有数字和换行符之外的字符(这些字符是'0-9 \n'这个集合的补集)
echo "this is a test !" | tr -s ' ' #参数-s压缩多个空格为单个
------------------------------------------------
tr可以像使用集合一样使用各种不同的字符类:
alnum:字母和数字
alpha:字母
cntrl:控制(非打印)字符
digit:数字
graph:图形字符
lower:小写字母
print:可打印字符
punct:标点符号
space;空白字符
upper:大写字母
xdigit:十六进制字符
使用方式:
tr [:class:] [:class:]
例如:
tr '[:lower:]' '[:upper:]' #将所有小写字母换成大写字母

[转帖]linux学习:sed与awk与tr用法整理的更多相关文章

  1. linux学习:sed与awk与tr用法整理

    流编辑器:sed 语法:sed [-hnV][-e<script>][-f<script文件>][文本文件] 参数: -e<script>或--expression ...

  2. linux学习:文件处理相关命令用法整理(正则表达式)

    指令:ls.cat.du.rename.dirname.basename.sort.diff.seq.head.tail.tree.chmod.cut.paster.正则 一:统计文件大小,行数,字符 ...

  3. [转帖]linux之sed用法

    linux之sed用法 https://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html docker images | awk ' ...

  4.  linux命令sed与awk是干什么用的,怎么用?

    非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的unix系统有几个非常命令的特点:1. 对于内核而言,unix文件都是字节序列.io设备也是文件.2. 至于文件的含义 ...

  5. [转帖]Linux学习笔记之rpm包管理功能全解

    Linux学习笔记之rpm包管理功能全解 https://www.cnblogs.com/JetpropelledSnake/p/11177277.html rpm 的管理命令 之前学习过 yum 的 ...

  6. [转帖]linux学习问题总结

    linux学习问题总结 https://www.cnblogs.com/chenfangzhi/p/10661946.html 学习作者的思路 目录 一.环境变量和普通变量的区别 二.rsyslog和 ...

  7. Linux之sed、awk

    Linux 之AWK 命令 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大. 简单来说awk就是把文件逐行的读入,以空格默认分隔 ...

  8. Linux(8):linux三剑客sed和awk & Shell 编程(1)

    linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...

  9. linux学习——sed工具

    命令格式: sed [-nefr] [动作] 1.sed可以分析标准输入(STDIN)的数据,然后将数据处理后,再将他输出到标准输出(STDOUT),他有替换.删除.新增.选定特定行等处理功能.sed ...

  10. Linux学习sed命令

    sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送 ...

随机推荐

  1. 【福利活动】华为云“上云之路”征文大赛开启,FreeBuds3无线耳机等重磅好礼送不停

    各位关注华为云的开发者们,达嘎猴啊~ 今天带给你们一个好消息,大家心心念念的华为云"上云之路"征文大赛已经正式开启啦. 举办本次华为云"上云之路"征文大赛的目的 ...

  2. 【菜鸟必看】stm32定时器的妙用

    摘要:本文为你带来关于stm32定时器的使用的便利和优势之处. 使用定时器去计算获取一条的时间 一.初步了解定时器 stm32定时器时钟图如下: 定时器2-7:普通定时器定时器1.8:高级定时器 二. ...

  3. Kafka 源码解析:Server 端的运行过程

    摘要:Kafka网络模块之Server端,介绍Server端启动.接收请求和处理请求的过程. 本文分享自华为云社区<Kafka网络模块-Server端>,原文作者:中间件小哥 . Sock ...

  4. 1500万员工轻松管理,云原生数据库GaussDB让HR办公更高效

    摘要: 云原生数据库GaussDB助力"2号人事部"打造高品质HR效率软件 本文分享自华为云社区<1500万员工轻松管理,云原生数据库GaussDB让HR办公更高效>, ...

  5. 有什么好用的C/C++源代码混淆工具?

    开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆.加密.使用任何工具都无法逆向.破解还原源文件.对APP进行完 ...

  6. 累加求和 1~ n求和

    a=1 ~ n 的求和 \[\sum_{a=1}^n a \] 公式:(首项 + 末项) * 项数/2 如果 a=1. n = 10 => (1+10)10/2 = 55 Python 代码 a ...

  7. C# 和 java 基本数据类型

    C# 和 java 基本数据类型 C#类型 java类型 描述 默认值 bool boolean 布尔值 False byte byte 8 位无符号整数 0 char char 16 位 Unico ...

  8. Win10家庭/企业/教育版均可升级到专业版

    升级前,先备份现有KEY: cmd中输入 regedit 打开注册表,根据下面路径找到 BackupProductKeyDefault 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\ ...

  9. 简洁好用的python-pip包更新工具

    今天推荐一个github的开源工具 pkgu,支持以表格形式展示当前python环境下的有新版本的package的版本信息,并支持全部或部分更新这些已经过期或者有新版的库. 该工具目前还提供了 cac ...

  10. JDK,Mysql,Tomcat Linux安装

    Linux的软件安装 JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep ja ...