文本截取与排序
- 排序
he squid project provides a number of resources toassist users design,implement and support squid installations. Please browsethe documentation and support sections for more infomation
```bash按单词出现的频率降序排序
$ echo $str|sed ‘s#[^a-zA-Z]#\n#g’|grep -v “^$”|sort|uniq -c|sort -rn -k1
按字母出现频率降序排序
$ echo $str|grep -o “.”|egrep -v “[^a-zA-Z]”|sort|uniq -c|sort -rn -k1
<a name="uMIrF"></a>
# 随机字符串
1. 生成随机数
> $RANDOM 生成随机 0 -32767的数字
```bash
# 生成0 - 32767 的随机数
$ echo $RANDOM
# 生成1000以内的随机数
$ echo $((RANDOM%1000))
使用for循环在/data目录下通过随机小写10个字母加固定字符串data批量创建10个txt文件
for i in seq 0 9
:
do
touch tr -dc "a-z" < /dev/urandom | head -c 10
data.txt
done
<a name="B46Ak"></a>
# 服务检测
1. ping
1. netstat
1. ps
<a name="uS89o"></a>
# 文件查找
1. 查找文件夹中文件及其子文件夹
```bash
file=$(pwd)/test
for i in `find $file -name "*2018"`
do
for n in `ls $i`:
do
sed -i "s/test/daba/g" $i/$n
done
done
题目
1 请写出一下命令执行的结果
bash$ echo “sinaops” | while read a ;do echo $a ;done
$ echo “sinaops” | read a ; echo $a
$ echo “sinaops” | while read a ;do echo $a ;done
“sinaops”
- 什么是linux的daemon进程?和一般进程有什么区别?
daemon进程又称为守护 进程,是在系统 启动就运行,系统关闭才停止的进程,独立于终端之外,不与客户端交互。一般进程在关闭终端后就停止了,而daemon进程不会停止。
因为daemon进程独立于终端,故使用ps axj命令查看进程时,其终端名(TTY)显示为?,终端前台进程组ID(TPGID)显示为-1
ps axj
怎么让一个进程在退出终端后继续运行?
1. nohup
2. 编写daemon程序
3. 由系统的daemon进程启动,这样进程就作为daemon的子进程,如写进crontab里
- 通过free命令查看内存是,看到的buffer和cache各表示什么含义?
1 2 3 4 5 6
1 total used free shared buffers cached
2 Mem: 24677460 23276064 1401396 0 870540 12084008
3 -/+ buffers/cache: 10321516 14355944
4 Swap: 25151484 224188 24927296
Mem: 第四列表示被几个进程共享的内存,第五列表示被OS buffer住的内存,buffer是用于存放要输出到disk(块设备)的数据的,而chche是存放从disk上读出的数据。
为什么有cached,而且比buffer大:为了提高IO read的性能,总是要多cache一些数据
buffer是用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
- 使用ln -s 和mv 对某一个文件做如下操作时(bash$ ln -s /usr/afile /etc/bfile bash$ mv /etc/afile /etc/bfile )对inode和block有哪些影响?
使用ln -s的时候,会形成一个软链接到新的路径,这时候新的路径会有一个新的inode指向它,在新的路径也会产生一个小的链接文件
使用mv的时候,在新的路径的文件,inode是不会变的,原来位置的文件会被移动到新的位置上,大小也和原来的文件相同
inode和block
硬盘要分区,然后格式化,创建文件系统。
inode,index node索引节点。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘…)被格式化为ext4文件系统后,一般有两部分:
第一部分是inode(很多个)
第二部分是block(很多个)
block是用来存储实际数据用的,例如:照片、视频等普通文件数据。
而inode就是用来存储这些数据属性信息的(也就是ls -l 的结果),inode包含的属性信息包括文件大小、属主、归属的用户组、读写权限、文件类型、修改时间,还包含指向文件实体的指针的功能(inode节点–block的对应关系)等,但是,inode唯独不包含文件名。
- apache和nginx这两个web服务器有哪些区别?
nginx:轻量级,并发能力很强,在处理静态文件上很强,作为负载均衡服务器可以支持七层负载,也是一个反向代理服务器,
apahce:rewrite比较强大,适合rewrite频繁的情景;支持php;处理动态请求有优势;
负载均衡分类:
- 二层负载均衡(mac)
根据OSI模型分的二层负载,一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应) - 三层负载均衡(ip)
一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应) - 四层负载均衡(tcp)
在三次负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。 - 七层负载均衡(http)
根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器)。
- 请列举你使用过的集群软件
- LB:nginx
- HA:heartbeat
- 描述tcp三次握手的过程
- 请说明一下http协议中的keeplive是做什么的?它的适应场景是什么?
Http底层也是通过TCP传输的,Http是一个”请求-响应”协议,它的keep-alive主要是为了让多个http请求共享一个Tcp连接,以避免每个Http又新建一个TCP连接。每个Http服务器默认的keep-alive时间可能是不一样的。
客户端发送了一个Http请求,服务器响应后,判断这个Http是否是keep-alive模式的,如果不是则关闭连接,如果是keep-alive,则等待keep-alive time后再关闭,如果这期间再收到一个http 请求,则继续等待最后一个请求的keep-alive time时间,直到keep-alive time时间内没有收到请求,则关闭。
上面是HTTP keep-alive的,而TCP是它下一层的协议,本身TCP是长连接的,除非主动关闭。HTTP的keep-alive time一般是15ms, 30ms之类的,如果是超过了HTTP的keep-alive time时间,则HTTP会关闭TCP连接。本身TCP是不会关闭连接的,TCP的keep alive是TCP的保鲜装置,在keep alive timeout 后服务端发送一个监测包来判断连接是否仍保持着,如果还是可连接,则继续保持,它不会主动关闭连接的。而心跳包是为了防止NAT超时。
- 请解释一下以下response header各行的含义?
Date
Tue,22Feb 2011 04:37:45 GMT
Server
Apache
Last-Modified
Thu,04 Nov 2010 04;12:24 GMT
Etag
“9fc-10c-82-5d73fa00”
Content-Length 130
Cache-Control max-age-2592000
Expires
Thu,24 Mar 2011 04:37:45 GMT
Age
21190
X-Cache
HIT from 86-74.ul.sinaimg.cn
Via
1.0.86-74.ul.sinaimg.cn:80(squid/2.6.STABLE21)
Connection
keep-alive
- session和cookie的实现原理和区别
cookie机制。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示
浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。而cookie的使用
是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围
大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。
session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识
(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来
使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相
关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应
中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给
服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时
仍然能够把session id传递回服务器。
区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
- 如何发现linux系统是否出现性能瓶颈?请例举出你常用的监控命令以及参数
top 显示正在运行而且处于活动状态的实时进程,而且会定期更新显示结果;它显示了cpu使用率,内存使用率,交换内存使用大小,调整缓存使用大小,缓冲区大小,进程pid,使用的命令等信息
vmstat 通过两个数字参数来完成,第一个是采样时间间隔,第二个是次数,可以查看系统资源的使用情况(r表示运行队列,如果队列过大说明CPU很繁忙,一般会造成CPU使用率高;swap虚拟内存已使用的大小,如果大于0,说明机器的物理内存不够了)
lsof列出打开的文件;它常用于以列表形式显示所有打开的文件和进程,包括磁盘文件,网络套接字,管道,设备和进程。
主要情形之一就是 无法挂载磁盘和显示正在使用或者打开某个文件的错误时,查看谁正在使用。
tcpdump 抓包
netstat 用于监控进出网络的包和网络接口统计的命令行工具,非常有用,用来监控网络性能,解决网络相关问题。
iostat 查看存储设备输入和输出状态统计的工具,用来追踪存储设备的性能 问题;包括设备,磁盘,NFS远程磁盘。
- 尽可能多的用不同语言打印“hello sina”
c: printf("hello sina");
c++:cout << "hello sina" << endl;
java:System.out.println("Hello World");
shell: echo "hello sina"
python2: print "hello sina"
python3: print("hello sina")
js: console.log("hello sina")
- bash shell 里$0.$?.$$各表示什么含义
$0 表示shell脚本的名称
$? 表示shell上一条命令的执行结果
$$ 表示当前Shell进程ID。对于Shell脚本,就是这些脚本所在的进程ID。
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$ 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $ 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
- 用任意脚本统计主机tcp连接数并按照连接状态分类
netstat -tn | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- 有一文件如下格式,请提取”.sina.com.cn”前面的主机名部分并写入到回到该文件中
bash$cat ip_list.txt
1 test.sina.com.cn
2 www.sina.com.cn
cat 1.txt | sed -i 's/\.sina\.com\.cn//g' 1.txt
- tcpdump嗅探80端口
tcpdump -i eth0 -tnn dst port 80 -c 1000
- linux系统的开机顺序
加载bios - 读取mbr - BootLoader - 加载内核 - 用户层init进程来设定系统运行的登记 - init进程执行rc.syninit - 加载内核模块 - 执行不同级别运行的脚本程序 -执行/etc/rc.d/rc.local(本地运行服务) - 执行/bin/login,就可以登录了
- 软连接和硬连接
软连接(符号链接)表示快捷方式
硬连接相当于复制
- 限制apache每秒新建连接数为1,峰值为3
iptables -A INPUT -d $ip -p tcp -dport 80 -m limit -limit 1/second -j ACCEPT
- FTP的主动模式和被动模式
FTP协议有两种工作模式:POST和PASV模式,主动式和被动式
post:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT 命令告诉服务器:“我打开了XX端口,你过来连接我”。于是服务器从20端口向客户端的 XX端口发送连接请求,建立一条数据链路来传送数据。
pasv:客户端向服务器的FTP端口(默认是21)发送连接请 求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV 命令告诉客户端:“我打开了XX端口,你过来连接我”。于是客户端向服务器的XX端口 发送连接请求,建立一条数据链路来传送数据。
- 系统软件安装和卸载的常见方法
- rpm -e rpm -e XXX.rpm (如果想忽略依赖,可加上–nodeps)
- yum remove 卸载过程会将待卸载的软件包所依赖的软件包一并卸载掉,很容易造成系统缺少某些包而崩溃等问题
- 源码包卸载:执行make uninstall,或者直接删除安装目录
- umask屏蔽位
umask 022
新建文件夹的基本码是777
文件的基本码是666
因此新建文件夹是777-022 = 755,新建文件是666-022=644,
综上所述,umask表示默认创建新文件权限为755
- 如何查看某个进程所打开的所有文件
# 取出进程号(举例crond)
ps -ef |grep cond |grep -v grep |awk '{print $2}'
2550
lsof -p 2550
lsof是一个列出当前系统打开文件的工具。
lsof 列出所有打开的文件
lsof /filepath/file 查看谁正在使用某个文件
lsof +D /filpath/ 递归查看某个目录的文件信息
lsof -u username 列出某个用户打开的文件信息
lsof -c mysql -c apache 查看程序文件信息
- 巡检脚本
- 检查磁盘
check_disk(){
chkdsk=`fdisk -l|egrep 'failed|unsynced|unavailable'|wc -l`
if [ "$chkdsk" -ge "1" ];then
echo 'fdisk check ok '
else
echo 'fdisk check find error,please check your disk '
fi
}
- 检查cpu Idle(CPU处于空闲状态时间比例)
check_cpuidle(){ # -u 输出cpu使用情况和统计信息 每隔两秒统计10次
mincpu=`sar -u 2 10|grep all|awk '{print $NF}'|sort -nr|tail -1`
if [ $(echo "${mincpu} < 20" | bc) = 1 ];then
#if [ "$mincpu" -le "20" ];then
echo 'cpu idle is less than 20% ,please check'
else
echo 'cpu idle is more than 20%, it is ok '
fi
}
- 检查io
check_io(){ # -d 输出每一块磁盘的使用信息 每隔两秒统计10次
util=`sar -d 2 10|egrep -v 'x86|^$|await'|awk '{print $NF}'|sort -nr|tail -1`
await=`sar -d 2 10|egrep -v 'x86|^$|await'|awk '{print $(NF-2)}'|sort -nr|tail -1`
if [ $(echo "${util} < 80" | bc) = 1 ] && [ $(echo "${await} < 100" | bc) = 1 ] ;then
echo 'disk io check is fine'
else
echo 'disk io use too high '
fi
}
- 检查磁盘空间
check_df(){
dfuse=`df -HT|awk '{print $6}'|grep -v Use|sed 's/%//g'|sort -nr|head -1`
if [ $(echo "${dfuse} < 80" | bc) = 1 ];then
echo 'disk used is less than 80% ,it is ok !'
elif [ $(echo "${dfuse} > 80" | bc) = 1 ] && [ $(echo "${dfuse} < 90" | bc) = 1 ];then
echo 'warning , disk used more than 80% and less than 90% '
else
echo ' Critical, disk used more than 90% '
fi
}