GNU sed

Linux-包教包会系列

こ雲淡風輕ζ 提交于 2020-03-21 21:00:05
3 月,跳不动了?>>> 前言 以前我的不喜欢用 Linux 系统,什么目录啊,文件啊,权限啊,都得命令操作,入门难度较大。但是一旦熟练起来,真不想再去用 windows 了。再加上 shell 脚本,那才叫如虎添翼啊,真的是见识到了什么才是性能,什么才是自动化。 Linux 相较于 windows 而言,占用内存更小,因为 windows 的图形化界面比较占内存。 Linux 的生态也比较丰富,各种各样的服务端软件都会有 Linux 版本。 Linux 也衍生出各种格言的版本,我用的比较多的是 Centos 在 Linux 中,一切皆文件。所以各种目录、文件的权限、创建者、所属组都是比较实用的东西。 本文内容基于<font color=red> Centos 7.4 </font> 版本。 主要内容: linux 目录说明 PATH 加载的原理及配置 常用简单命令 sed,awk,find,管道流,重定向,scp 目录介绍 Linux 中的目录还是要清楚的,有一些约定成俗的规定需要大家了解。 目录只介绍一些重要常用的。大致了解什么作用即可。 根目录- / 根目录下面有许多子目录 bin etc home opt usr sbin var tmp 等等。 /root 是用户 root 的家目录。 /home 除 root 用户之外的其它的用户家目录。 cd ~

第04问:仅用慢日志文件,如何快速获取分时报告?

人盡茶涼 提交于 2020-03-20 18:29:46
3 月,跳不动了?>>> 问题 仅用慢日志文件,如何快速获取分时报告? 如果有监控系统,获取分时报告(每小时慢查询的条数报告)不难,如果只有慢日志文件,就会有点费劲。 实验: 通过 pt-query-digest --timeline 功能,可以输出带时间戳的慢查询条目 用 sed 将 timeline 报告滤出 安装 termsql 使用 termsql,将报告导入,并使用 SQL 查询一条记录,以展示 termsql 的效果 可以看到 termsql 将 timeline 报告的每一行,整理成了一条数据,放在 SQLite 中。 下面就可以尽情使用 SQL 获取分时报告: 用一个复杂一点慢日志,获得如下结果: 可以轻松定位到慢查询的热点时段,也便于发现业务的周期性规律。 小贴士: termsql 是一个很方便的小工具: 可以用于将文本导出到 SQLite 中,方便 SQL 查询。 它与 ps 或者 top 合用也有惊喜,比如找出 CPU 占用率高于 25% 的进程: 来源: oschina 链接: https://my.oschina.net/actiontechoss/blog/3207230

Linux命令---cut

痞子三分冷 提交于 2020-03-19 17:36:12
3 月,跳不动了?>>> cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。 (1)其语法格式为: cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file] 使用说明 cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。 主要参数 -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f :与-d一起使用,指定显示哪个区域。 -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除。 (2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢? cut命令主要是接受三个定位方法: 第一,字节(bytes),用选项-b 第二,字符(characters),用选项-c 第三,域(fields),用选项-f (3)以“字节”定位 举个例子吧,当你执行ps命令时,会输出类似如下的内容:

Linux Shell常用技巧(三)

混江龙づ霸主 提交于 2020-03-02 02:33:14
sed一次处理一行文件并把输出送往屏幕。sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space)。一旦sed完成对模式空间中的行的处理,模式空间中的行就被送往屏幕。行被处理完成之后,就被移出模式空间,程序接着读入下一行,处理,显示,移出......文件输入的最后一行被处理完以后sed结束。通过存储每一行在临时缓冲区,然后在缓冲区中操作该行,保证了原始文件不会被破坏。 1. sed的命令和选项: 命令功能描述 a\ 在当前行的后面加入一行或者文本。c\ 用新的文本改变或者替代本行的文本。d 从pattern space位置删除行。i\ 在当前行的上面插入文本。h 拷贝pattern space的内容到holding buffer(特殊缓冲区)。H 追加pattern space的内容到holding buffer。g 获得holding buffer中的内容,并替代当前pattern space中的文本。G 获得holding buffer中的内容,并追加到当前pattern space的后面。n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。p 打印pattern space中的行。P 打印pattern space中的第一行。q 退出sed。w file 写并追加pattern space到file的末尾。!

使用top分析tomcat容器占用的内存排行

戏子无情 提交于 2020-03-01 16:26:48
命令: top -b -n1 | awk 'NR<=7{print;next}{n=$6;if(n~/m/)n*=1024;if(n~/g/)n*=1024*1024;a[sprintf("%12d",n)]=$0"\n"a[n]}END{c=asorti(a,b);for(n=c;n>0;n--)printf("%s", a[b[n]])}'|grep -A 10 'COMMAND' |grep 'java'|awk '{print $1 " " $6}'|while read line; do pid=$(echo $line|awk '{print $1}'); mem=$(echo $line|awk '{print $2}'); name=$(cd /var/lib/docker/containers ;grep -R Pid ./*|grep Pid|grep ${pid}|grep -o "\"/[a-zA-Z]*-0"|sed 's#"/##'); echo -e "${pid}\t${mem}\t${name}"; done CRT button: top -b -n1 | awk 'NR<=7{print;next}{n=$6;if(n~/m/)n*=1024;if(n~/g/)n*=1024*1024;a[sprintf("%12d",n)]=$0"\\n"a

day19:打印文档中只有一个数字的行|实习日记归档功能|统计一个网段内在线IP|检查脚本错误退出及编辑|随机数字按千分为输出

感情迁移 提交于 2020-02-29 22:07:32
1 、用shell脚本把一个文本文档中只有 一个数字的行 给打印处理;准备一下test.txt文件用来测试,内容如下: [root@localhost_001 ~]# cat test.txt aaa: 1 :abcde:sdfsd:sdfasd bbb: 22 :adsafsadfsdaf:sdafsd bbb: 2 : 233 : 3 sdfsdf 分析:既然要只有一个数字的行,也就是要针对每一行去逐行去处理,此处用到了for循环或者while分别处理每一行; 判断某行有一个数字,可以这样来实现: 过滤出 非0-9的内容替换为空 ,并统计字符长度; sed 's#[^0-9]##g'|wc -L [root@localhost_001 ~]# sed -n '1'p test.txt|sed 's#[^0-9]##g'|wc -L 1 [root@localhost_001 ~]# sed -n '2'p test.txt|sed 's#[^0-9]##g'|wc -L 2 [root@localhost_001 ~]# sed -n '3'p test.txt|sed 's#[^0-9]##g'|wc -L 5 首先统计出文件的行数, wc -l test.txt|awk '{print $1}' [root@localhost_001 ~]# wc -l test.txt

^ M字符在Vim中意味着什么?

廉价感情. 提交于 2020-02-28 08:26:07
我一直在我的vimrc中获得 ^M 字符并且它破坏了我的配置。 #1楼 :%s/\r//g 今天为我工作。 但我的情况可能略有不同。 #2楼 在FreeBSD中,您可以通过键入以下内容手动清除 ^M : :%s/ Ctrl + V ,然后按Ctrl + M ,然后再按Ctrl + M. #3楼 翻译新行而不是删除它: :%s/\r/\r/g #4楼 我有一个文本文件,最初是通过Mac用户在Windows机器上生成的,需要使用 load data 命令将其导入Linux MySQL数据库。 虽然VIM显示'^ M'字符,但上述所有内容都不适合我的特定问题,数据会导入,但总是以某种方式损坏。 解决方案最终很容易(经过很多挫折)。 解决方案:在同一个文件上执行 dos2unix TWICE 就可以了! 使用 file 命令可以显示整个过程中发生的情况。 $ file 'file.txt' file.txt: ASCII text, with CRLF, CR line terminators $ dos2unix 'file.txt' dos2unix: converting file file.txt to UNIX format ... $ file 'file.txt' file.txt: ASCII text, with CRLF line terminators $

CentOS-配置YUM源加速(阿里云、Nexus3)

一笑奈何 提交于 2020-02-28 05:58:59
备份本地源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 配置CentOS6 $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo $ sed -i 's/$releasever/6/g' /etc/yum.repos.d/CentOS-Base.repo 配置CentOS7 $ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo $ sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo 配置Nexus3私服YUM源 (可选,适用于中小企业) 注:没有搭建nexus3私服,请直接忽略此步骤 $ vim CentOS-Base.repo 仅替换[base]即可 [base] name=Nexus baseurl= http:// 192.168.1.100:8081 /repository/ yum-public / $releasever /os/

打印一个文件,跳过Bash中的第一行X行

杀马特。学长 韩版系。学妹 提交于 2020-02-28 04:21:29
我有一个很长的文件,我想打印但跳过第一个1e6行例如。 我查看了猫手册页,但我没有看到任何选项。 我正在寻找一个命令来做这个或一个简单的bash程序。 #1楼 我发现删除文件前十行的最简单方法: $ sed 1,10d file.txt #2楼 cat < File > | awk '{if(NR > 6) print $0}' #3楼 如果你想看到前10行你可以使用sed如下: sed -n '1,10 p' myFile.txt 或者如果你想看到20到30行,你可以使用: sed -n '20,30 p' myFile.txt #4楼 使用AWK的简洁版本: awk 'NR > 1e6' myfile.txt 但我建议使用整数。 #5楼 如果你想跳过前两行 tail -n +3 <filename> 如果你想跳过第一个x行 tail -n +$((x+1)) <filename> 来源: oschina 链接: https://my.oschina.net/u/3797416/blog/3159858

如何从Bash中的路径字符串中删除文件后缀和路径部分?

十年热恋 提交于 2020-02-28 03:48:45
给定一个字符串文件路径(例如 /foo/fizzbuzz.bar ,我将如何使用bash提取字符串中的 fizzbuzz 部分? #1楼 看一下basename命令: NAME=$(basename /foo/fizzbuzz.bar .bar) #2楼 纯bash方式: ~$ x="/foo/bar/fizzbuzz.bar.quux.zoom"; ~$ y=${x/\/*\//}; ~$ echo ${y/.*/}; fizzbuzz 在man bash的“参数扩展”下解释了此功能。 非bash方式比比皆是:awk,perl,sed等。 编辑:使用文件 后缀中的 点,并且不需要知道后缀(扩展名),但 不适 用于 名称 本身中的点。 #3楼 perl -pe 's/\..*$//;s{^.*/}{}' #4楼 basename和dirname函数是您所需要的: mystring=/foo/fizzbuzz.bar echo basename: $(basename "${mystring}") echo basename + remove .bar: $(basename "${mystring}" .bar) echo dirname: $(dirname "${mystring}") 输出: basename: fizzbuzz.bar basename + remove