awk

转自 shell相关的,后续需进一步学习 awk是对文本和数据进行处理的编程语言 其实sed和awk都是每次读入一行来处理的,区别是: sed 适合简单的文本替换和搜索; 而awk除了自动给你分列之外,里面丰富的函数大大增强了awk的功能。数据统计,正则表达式搜索,逻辑处理,前后置脚本等。 sed的核心是正则,awk的核心是格式化。 因此基本上sed能做的,awk可以全部完成并且做的更好。 补充说明 awk 是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。 awk命令格式和选项 语法形式 常用命令选项 -F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F: -v var=value 赋值一个用户定义变量,将外部变量传递给awk -f scripfile 从脚本文件中读取awk命令 -m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 awk模式和操作 awk脚本是由模式和操作组成的。 模式 模式可以是以下任意一个: /正则表达式/:使用通配符的扩展集。 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 模式匹配表达式:用运算符~(匹配)和~!(不匹配)。 BEGIN语句块、pattern语句块、END语句块:参见awk的工作原理 操作 操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是: 变量或数组赋值 输出命令 内置函数 控制流语句 awk脚本基本结构 一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被 单引号 或 双引号 中,例如: awk的工作原理 第一步:执行BEGIN{ commands }语句块中的语句; 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ commands }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。 第三步:当读至输入流末尾时,执行END{ […]

Linux是如何管理内存的?

转:OSC开源社区 Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的。 基本概念 每个 Linux 进程都会有地址空间,这些地址空间由三个段区域组成:text 段、data 段、stack 段。下面是进程地址空间的示例。 数据段(data segment) 包含了程序的变量、字符串、数组和其他数据的存储。数据段分为两部分,已经初始化的数据和尚未初始化的数据。其中尚未初始化的数据就是我们说的 BSS。数据段部分的初始化需要编译就期确定的常量以及程序启动就需要一个初始值的变量。所有 BSS 部分中的变量在加载后被初始化为 0 。 和 代码段(Text segment) 不一样,data segment 数据段可以改变。程序总是修改它的变量。而且,许多程序需要在执行时动态分配空间。Linux 允许数据段随着内存的分配和回收从而增大或者减小。为了分配内存,程序可以增加数据段的大小。在 C 语言中有一套标准库 malloc 经常用于分配内存。进程地址空间描述符包含动态分配的内存区域称为 堆(heap)。 第三部分段是 栈段(stack segment)。在大部分机器上,栈段会在虚拟内存地址顶部地址位置处,并向低位置处(向地址空间为 0 处)拓展。举个例子来说,在 32 位 x86 架构的机器上,栈开始于 0xC0000000,这是用户模式下进程允许可见的 3GB 虚拟地址限制。如果栈一直增大到超过栈段后,就会发生硬件故障并把页面下降一个页面。 当程序启动时,栈区域并不是空的,相反,它会包含所有的 shell 环境变量以及为了调用它而向 shell 输入的命令行。举个例子,当你输入 时,cp 程序会运行并在栈中带着字符串 cp […]

命令行工具——curl(转)

作者 | 琼璞 责编 | 张红月 来源 | 晚晴幽草轩(ID:nice-links) curl 非常有用的命令行工具库,用于通过 URL 传输数据。它的名字就是客户端(client)的 URL 工具的意思(command line tool and library for transferring data with URLs)。它的功能非常强大,命令行参数多达几十种。如能熟练使用,可以在很多应用场景下,发挥巨大的价值。本篇文章,就跟大家一起探讨下 curl 以及关于它的那些妙用。 关于 curl **** curl 是免费的开源软件,截止 2021 年 2 月,最近稳定版本是 7.75.0;它支持包括 FTP、HTTP、HTTPS、FTP、SCP,SFTP 数十种协议;curl 在命令行或脚本中用于传输数据。另外,它还用于汽车,电视机,路由器,打印机,音频设备,移动电话,平板电脑,机顶盒,媒体播放器中,并且是数千种每天影响数十亿人口的软件应用程序的互联网传输基础。如果您想了解更多关于 curl,可参见 curl.se 或 github.com/curl/curl。 如何使用 **** 如上命令,不带有任何参数时,curl 就是发出 GET 请求(向 nicelinks.site,服务器返回的内容会在命令行输出。当然,你还可以为其添加各种参数(如 -A、-b、-c、-d、-e、-F、-H等等),使得可以完成更多复杂任务; -e -e参数用来设置 HTTP 的标头Referer,表示请求的来源。 […]

Centos 7错误操作yum导致error: rpmdb解决方法(转CSDN)

错误: [root@mykurol ~]# yum error: rpmdb: BDB0113 Thread/process 18967/139716328294400 failed: BDB1507 Thread died in Berkeley DB library error: db5 error(-30973) from dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery error: cannot open Packages index using db5 – (-30973) error: cannot open Packages database in /var/lib/rpm CRITICAL:yum.main: Error: rpmdb open failed 原因:rpm数据库损坏。 解决方法(重新构建rpm数据库): [root@mykurol~]# cd/var/lib/rpm [root@mykurol rpm]# ls Basenames __db.001 __db.003GroupNamePackagesRequirenameSigmd5 Conflictname __db.002DirnamesInstalltidObsoletenameProvidenameSha1headerTriggername [root@mykurol rpm]# rm-rf __db.* [root@mykurol rpm]# rpm–rebuilddb

查找隐藏进程(比如挖矿进程)

转自:Java技术迷 Yesterday CPU起飞了 最近有朋友在群里反馈,自己服务器的CPU一直处于高占用状态,但用top、ps等命令却一直找不到是哪个进程在占用,怀疑中了挖矿病毒,急的团团转。 根据经验,我赶紧让他看一下当前服务器的网络连接,看看有没有可疑连接,果然发现了有点东西: 上Shodan查一下这IP地址: 反向查找,发现有诸多域名曾经解析到这个IP地址: 这是一个位于德国的IP地址,开放了4444,5555,7777等数个特殊的服务端口: 其中这位朋友服务器上发现的连接到的是7777端口,钟馗之眼显示,这是一个HTTP服务的端口,直接访问返回的信息如下: mining pool!,服务器正在挖矿实锤了! 但神奇的是,这个进程像是隐身了一般,找不到存在的任何痕迹。 进程如何隐藏 现在说回到本文的正题:Linux操作系统上,进程要隐藏起来,有哪些招数? 要回答这个问题,先来知道ps、top等命令枚举系统的进程列表的原理。 Linux的设计哲学是:一切皆文件! 进程也不例外, Linux系统中有一个特殊的目录:/proc/,这个目录下的内容,不是硬盘上的文件系统,而是操作系统内核暴露出的内核中进程、线程相关的数据接口,也就是procfs,里面记录了系统上正在运行的进程和线程信息,来查看一下: 这些以数字命名的目录,就是一个进程的PID,里面记录了该进程的详细信息。 而ps、top等命令的工作原理,实质上就是遍历这个目录。 知道了原理,想实现隐藏就有以下几个思路: 命令替换 直接替换系统中的ps、top命令工具。可以从GitHub上下载它们的源码,加入对应的过滤逻辑,在遍历进程的时候,剔除挖矿进程,实现隐藏的目的。 模块注入 编写一个动态链接库so文件,在so中,HOOK遍历相关的函数(readdir/readdir64),遍历的时候,过滤挖矿进程。 通过修改LD_PRELOAD环境变量或/etc/ld.so.preload文件,配置动态链接库,实现将其注入到目标进程中。 内核级隐藏 模块注入的方式是在应用层执行函数HOOK,隐藏挖矿进程,更进一步,可以通过加载驱动程序的方式在内核空间HOOK相应的系统调用来实现隐藏。不过这对攻击者的技术要求也更高,遇到这样的病毒清理起来挑战也更大了。 揪出挖矿进程 通过上面的进程隐藏原理看得住来,都是想尽办法隐藏/proc目录下的内容,类似于“障眼法”,所以包含ps、top、ls等等在内的命令,都没办法看到挖矿进程的存在。 但蒙上眼不代表不存在,有一个叫unhide的工具,就能用来查看隐藏进程。 我让这位朋友安装这个工具来查找隐藏的进程,但奇怪的是,一执行yum install安装,远程连接的SSH会话就立刻断开。 于是退而求其次,选择通过源码安装,又是一直各种报错··· 因为我没办法亲自操作这台服务器,沟通起来比较麻烦,于是我决定研究下这个unhide工具的源码,然后编一个python脚本发给他执行。 源码地址:https://github.com/YJesus/Unhide-NG/blob/master/unhide-linux.c 在查找隐藏进程模块,其大致使用了如下的方法: 挨个访问 /proc/pid/ 目录,其中,pid从1到到max_pid累加 如果目录不存在,跳过 如果是unhide自己的进程,跳过 如果在ps命令中能看到,跳过 剩下的,既不是自己,也不在ps命令输出中,则判定为隐藏进程 按照这个思路,我编写了一个Python脚本发给这位朋友,执行后果然发现了隐藏的进程: 别着急,不是真的有这么多进程,这里是把所有的线程ID列举出来了。随便挑选了一个看一下: 还记得前面通过netstat命令看到挖矿进程建立了一个网络连接吗?Linux一切皆文件,在 /proc/pid/fd 目录下有进程打开的文件信息: 这里发现这个进程打开了一个socket,后面的10212是inode id,再通过下面的命令看一下这个socket到底是什么: cat /proc/net/tcp | grep […]

一份超详细的Linux命令及Java问题排查工具单

一份超详细的Java问题排查工具单 转自:云栖社区,作者:红魔七号 前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记,可以让自己后续忘记了可快速翻阅,二是分享,希望看到此文的同学们可以拿出自己日常觉得帮助很大的工具,大家一起进步。闲话不多说,开搞。 Linux命令类 tail 最常用的tail -f grep awk 1.基础命令 2.匹配 3.内建变量 NR:NR表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此默认的就是读取的数据行数,NR可以理解为Number of Record的缩写。 FNR:在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。 NF: NF表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。 find pgm 批量查询vm-shopbase满足条件的日志 tsar tsar是咱公司自己的采集工具。很好用, 将历史收集到的数据持久化在磁盘上,所以我们快速来查询历史的系统数据。当然实时的应用情况也是可以查询的啦。大部分机器上都有安装。 top top除了看一些基本信息之外,剩下的就是配合来查询vm的各种问题了 获得线程10进制转16进制后jstack去抓看这个线程到底在干啥 其他 排查利器 btrace (第三方) 首当其冲的要说的是btrace。真是生产环境&预发的排查问题大杀器。简介什么的就不说了。直接上代码干 1.查看当前谁调用了ArrayList的add方法,同时只打印当前ArrayList的size大于500的线程调用栈 2.监控当前服务方法被调用时返回的值以及请求的参数 其他功能集团的一些工具或多或少都有,就不说了。感兴趣的请移步。https://github.com/btraceio/btrace 注意:经过观察,1.3.9的release输出不稳定,要多触发几次才能看到正确的结果正则表达式匹配trace类时范围一定要控制,否则极有可能出现跑满CPU导致应用卡死的情况由于是字节码注入的原理,想要应用恢复到正常情况,需要重启应用。 Greys(第三方) Greys是@杜琨的大作吧。说几个挺棒的功能(部分功能和btrace重合): sc -df xxx: 输出当前类的详情,包括源码位置和classloader结构 trace class method: 相当喜欢这个功能! 很早前可以早JProfiler看到这个功能。打印出当前方法调用的耗时情况,细分到每个方法。对排查方法性能时很有帮助,比如我之前这篇就是使用了trace命令来的:http://www.atatech.org/articles/52947。 其他功能部分和btrace重合,可以选用,感兴趣的请移步。http://www.atatech.org/articles/26247 另外相关联的是arthas,他是基于Greys的,感兴趣的再移步http://mw.alibaba-inc.com/products/arthas/docs/middleware-container/arthas.wiki/home.html?spm=a1z9z.8109794.header.32.1lsoMc […]

Centos下shell脚本添加开机自启动

方法一:传统方式 1、赋予脚本可执行权限 chmod 777 /root/vpn/auto_vpn.sh 2、打开/etc/rc.d/rc.local文件,在末尾增加如下内容 /root/vpn/auto_vpn.sh 3、在centos中,/etc/rc.d/rc.local的权限被降低了,所以需要执行如下命令赋予其可执行权限 chmod +x /etc/rc.d/rc.local 最后,当前更推荐服务的方式启动,但服务比较麻烦。不适合简单的启动脚本 方法二:(chkconfig) 1、将脚本移动到/etc/rc.d/init.d目录下 mv /usr/local/script/autostart.sh /etc/rc.d/init.d 2、增加脚本的可执行权限 chmod +x /etc/rc.d/init.d/autostart.sh 3、添加脚本到开机自动启动项目中 cd /etc/rc.d/init.d chkconfig –add autostart.sh chkconfig autostart.sh on chkconfig启动脚本规范 在脚本开头加入下面内容: #!/bin/sh #chkconfig:2345 80 90 #decription:autostart 说明:chkonfig后面是启动级别和优先级,description后面是服务描述。如上面脚本意思是, 服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,停止的优先级是10。 优先级范围是0-100,数字越大,优先级越低。 注意:不添加以上内容的话添加启动项时会提示service myservice does not support chkconfig Linux启动优先级 运行级别就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。 这些级别在/etc/inittab文件里指定。这个文件是init程序寻找的主要文件,最先运行的服务是那些放在/etc/rc.d 目录下的文件。不同的运行级定义如下:(可以参考Linux里面的/etc/inittab) # 缺省的运行级,RHS用到的级别如下: 0:关机 1:单用户模式 […]

lWoHvYe 无悔,专一