面试问题如下:
1.linux系统下查看当前进程占用内存情况?
动态查看一个进程的内存使用
- 1、top命令
- top -d 1 -p pid [,pid ...] //设置为delay 1s,默认是delay 3s
- 如果想根据内存使用量进行排序,可以shift + m(Sort by memory usage)
静态查看一个进程的内存使用
- 1、pmap命令
- pmap pid
-
- 2、ps命令
- ps aux|grep process_name
-
- 3、查看/proc/process_id/文件夹下的status文件
- Name: php
- State: R (running)
- SleepAVG: 0%
- Tgid: 21574
- Pid: 21574
- PPid: 10005
- TracerPid: 0
- Uid: 1000 1000 1000 1000
- Gid: 100 100 100 100
- FDSize: 256
- Groups: 16 100
- VmPeak: 161740 kB
- VmSize: 161740 kB
- VmLck: 0 kB
- VmHWM: 107144 kB
- VmRSS: 107144 kB
- VmData: 106192 kB
- VmStk: 84 kB
- VmExe: 5588 kB
- VmLib: 7884 kB
- VmPTE: 268 kB
- Threads: 1
- SigQ: 0/69632
- SigPnd: 0000000000000000
- ShdPnd: 0000000000000000
- SigBlk: 0000000000000000
- SigIgn: 0000000000001000
- SigCgt: 00000001818040a7
- CapInh: 0000000000000000
- CapPrm: 0000000000000000
- CapEff: 0000000000000000
- Cpus_allowed: 00000000,00000000,00000000,0000000f
- Mems_allowed: 1
-
- 任务虚拟地址空间的大小 VmSize
- 应用程序正在使用的物理内存的大小 VmRSS
2.linux系统查看当前进程使用动态链接库的命令?
lsof命令
3.linux系统gdb常用命令?
本机调试
带参数启动
gdb --args ./program arg1 arg2 arg3
在main()处断点
break main
启动以后设置参数运行
run arg1 arg2 arg3
取消参数开始运行
set args
run
设置参数
set args arg1 arg2 arg3
run
分析core文件
gdb ./test ./test.core
gdb --core=./test.core ./test
gdb ./test 2640
gdb --pid=2640 ./test
远程调试
目标机器
gdbserver 127.0.0.1:1234 ./test
主机:
target remote 127.0.0.1:1234
break main
run
调试控制命令:
step 单步,参数N表示单步几次,一般可以用作步入到 子函数 调用中去。(vc++的F11,windbg的t)
stepi 指令集的step,一般在汇编窗口调用。
next 类似单步,只不过把子函数调用当做一个指令预先执行掉,不跟进去。(vc++的F10,windbg的p)
nexti 指令集的next,一般在汇编窗口调用。
until 执行到比当前行号大的一行为止。用作步出循环体,这个时候刚好在循环体的最后一行,可以执行这个步出循环。
finish 执行到当前栈即将返回的位置。用于将当前函数执行完毕返回。(vc++的shift+F11,windbg的pt,tt,wt)
advance 推进到某个位置advance 27表示推进到27行,(vc++的ctrl+F11, windbg的pa, "step to address")
jump 跳到某个指令直接执行, jump 27 直接跳到27行开始执行,最好在27行之后某个位置断点一个看看。(windgb的r eip=0x41000100)
断点指令:
break main 函数名断点
break test.c : 27 文件的27行断点
break *0x00000000004005f0 在汇编指令的地址处断点, 前面有一个星号
硬件数据断点
awatch 访问断点access watch; awatch i, 当i被访问的时候,程序断开。(类似于windbg的ba断点)
watch 写入数据断点,watch i 当i的值被修改的时候,断开。
rwatch 读取断点, 当i的值被读取的时候断开。
hbreak 硬件指令断点, hbreak *0x0000000000400606 在这个地址设置硬件断点
条件断点:
在循环体的11行断点,只有循环计数器是20的时候断开。
www.2cto.com
(gdb) break 11 if i=20
Breakpoint 2 at 0x4005c9: file test.cxx, line 11.
(gdb) info breaks
Undefined info command: "breaks". Try "help info".
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005c0 in foo() at test.cxx:9
breakpoint already hit 1 time
2 breakpoint keep y 0x00000000004005c9 in foo() at test.cxx:11
stop only if i=20
(gdb) c
Continuing.
0
Breakpoint 2, foo () at test.cxx:11
11 printf("%d\n",i);
(gdb) p i
$1 = 20
数据查看命令:
print 打印变量的值,print i, 查看变量i当前的值。
x 内存检查, Examine the memory, x /nfs n=count of unit to examine. f=format,(x=hex; d=decimal, c=char); s=sizeof of unit
display 每次gdb获得控制的时候,打印变量的值,display i; 在单步的时候,每次查看i的变化;
栈操作指令:
info stack 查看当前线程栈的情况,看函数调用链。类似于bt;
backtrace, 栈回溯
info frame 查看当前函数帧的信息。
up 往调用链的上游移动,看看caller是谁。
down 往调用链的下游移动,看看callee是谁。
frame 2 移动到第二个帧(count from callee->caller)
return 从选定栈执行返回到caller, 和finish类似的功能, 很好的一个功能哦.
4.linux系统查看性能命令?
一般我们查看系统性能主要是在以下几个方面
1.用户使用CPU情况 展现为 %user
2.系统使用CPU情况 展现为 %sys
3.wio或iowait 展现为 %iowait 进程由于等待磁盘IO而使CPU处于空闲状态的比率
4.CPU的空闲率
5.CPU上下文的交换的比率,也有说明为CPU上下文的切换。即内存和寄存器中数据的切换
6.nice 这个还不是很明白是啥意思
7.real-time 还是未知
8.运行队列的长度
9.平均负载
二 常用命令
1.mpstat
2.top
3.vmstat
4.sar
5.iostat
6.uptime
三命令详解
1. mpstat -P ALL 5 //需要注意的P和ALL一定要大写
17时22分24秒 CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
17时22分29秒 all 0.30 0.00 0.10 0.67 0.02 0.07 0.00 98.83 821.40
17时22分29秒 0 1.00 0.00 0.60 1.00 0.20 0.60 0.00 96.60 560.00
17时22分29秒 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.20 0.00
17时22分29秒 2 0.60 0.00 0.20 0.20 0.00 0.20 0.00 99.00 250.20
17时22分29秒 3 0.00 0.00 0.00 4.00 0.00 0.00 0.00 96.00 11.20
17时22分29秒 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.20 0.00
17时22分29秒 5 0.80 0.00 0.00 0.00 0.00 0.00 0.00 99.20 0.00
17时22分29秒 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
17时22分29秒 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 0.00
上面信息我们可以看出,有8个CPU。
%user :在internal时间段里,即为用户态的CPU时间,及登录用户所消耗的CPU时间比。
%sys :在internal时间段里,负进程消耗的CPU时间,占所有CPU的百分比
%nice :优先进程占用时间
%iowait:在internal时间段里,所有未等待磁盘IO操作进程占CPU的百分比
%irq : 这个还是未知
%soft : 在internal时间段里,软中断时间(%) softirq/total*100
%idle : 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 (%)
intr/s: 在internal时间段里,每秒CPU接收的中断的次数
3.vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 1 1385712 66752 112164 1429992 3 4 14 50 14 2 10 2 88 1 0
1 0 1385712 64540 112208 1430976 0 0 3 104 2599 6595 15 2 81 3 0
0 0 1385712 62084 112232 1433008 0 0 1 1276 2068 7772 18 1 77 4 0
0 0 1385712 60808 112232 1434036 0 0 1 29 730 3686 9 1 90 1 0
参数详解:
r:当前系统中等待CPU的进程数(所有的CPU),若是改值连续都大于CPU的个数,表明有多数进程在等待CPU进行处理。若是该值大于CPU个数4倍的话,那么表明该服务器缺少CPU,或者CPU的处理速度过慢
in :cpu每秒产生的中断数
cs :每秒产生的上下文切换
us:用户占用的CPU时间百分比,同mpstat 的%user,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速(比如PHP/PERL)
sy:系统占用的CPU时间百分比,同mpstat 的%sys。内核进程消耗的CPU时间百分比(sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因)
id:CPU处于空闲状态时间百分比,如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us) 系统则面临着CPU资源的短缺.
wa:IO等待消耗的CPU时间百分比,wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
us+sy+id = 100%
常见用法:
vmstat -n 3 //每三秒获取一次数据
vmstat 4 5 //间隔4次输出5次数据
概念详解:
上下文切换:CPU的切换就是将轮到该时间片的进程,将该进程中的数据从内容中刷到CPU的寄存器中,同时将原寄存器中的数据刷到内存中保存。
4.sar
sar [options] [-A] [-o file] t [n]
t 和 n两个参数指定了采样间隔和采样次数
- o 较日志记录到某个文件中
sar 5 6 //每5秒采用一次,共采样6次。
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/28/2009
07:40:17 PM CPU %user %nice %system %iowait %steal %idle
07:40:19 PM all 12.44 0.00 6.97 1.74 0.00 78.86
07:40:21 PM all 26.75 0.00 12.50 16.00 0.00 44.75
07:40:23 PM all 16.96 0.00 7.98 0.00 0.00 75.06
参数详解:
大部分的参数同mpstat top等命令。
%idle :等同于vmstat 中的id .就是空闲CPU百分比.如果该值高,表明CPU较空闲,但是处理速度还是很慢,则表明CPU在等待内存分配,应该加大服务器的内存。若是该值持续低于10%,表明CPU处理能力较弱,需要增加CPU。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
5.iostat 主要是为了查看磁盘IO
Linux 2.6.16.46-0.12-smp (iread-85) 03/29/2010
avg-cpu: %user %nice %system %iowait %steal %idle
9.47 0.00 1.59 1.27 0.00 86.67
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 15.46 114.45 401.22 44378459 155576936
参数详解:
avg-cpu中参数不做过多解释,详细可见其他命令,类似。
rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s: 每秒读扇区数。即 delta(rsect)/s
wsec/s: 每秒写扇区数。即 delta(wsect)/s
rkB/s: 每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s: 每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz:平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await: 平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
2. top //直接敲TOP即可。
//系统当前时间、启动时间、当前登录数、平均负载 1、5、15分钟负载值
top - 19:43:46 up 4 days, 10:46, 7 users, load average: 0.25, 0.37, 0.38
//进程总数、运行进程数、休眠进程数、终止进程数、僵死进程数
Tasks: 222 total, 1 running, 221 sleeping, 0 stopped, 0 zombie
//用户占用、系统占用、优先线程占用、闲置线程占用、
Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 98.5%id, 1.0%wa, 0.0%hi, 0.1%si, 0.0%st
//内存状态(总内存、已用内存、闲置内存、缓存使用内容)
Mem: 8183648k total, 8124052k used, 59596k free, 115072k buffers
//交换内存(总交换内存、已用内存、闲置内存、高速缓存容量)
Swap: 2104472k total, 1369376k used, 735096k free, 1462236k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 16 0 784 72 40 S 0 0.0 0:06.28 init
2 root RT 0 0 0 0 S 0 0.0 0:00.08 migration/0
3 root 34 19 0 0 0 S 0 0.0 0:00.01 ksoftirqd/0
4 root RT 0 0 0 0 S 0 0.0 0:00.29 migration/1
5 root 34 19 0 0 0 S 0 0.0 0:00.00 ksoftirqd/1
6 root RT 0 0 0 0 S 0 0.0 0:00.21 migration/2
7 root 34 19 0 0 0 S 0 0.0 0:00.05 ksoftirqd/2
8 root RT 0 0 0 0 S 0 0.0 0:00.08 migration/3
9 root 34 19 0 0 0 S 0 0.0 0:00.01 ksoftirqd/3
10 root 10 -5 0 0 0 S 0 0.0 0:00.02 events/0
11 root 10 -5 0 0 0 S 0 0.0 0:00.00 events/1
参数详解:top命令式将系统最敏感的参数信息列出来。
PR :系统进程的分配的处理时间,若是16,则表示分配了16*10毫秒的时间长度来处理该线程。数值越大,代表处理时间越长。
NI :该进程的优先级
RES :该进程占用的物理内存的总数量,单位是KB。
SHR(SHARE) :该进程使用共享内存的数量。单位是KB
S(STAT) :该线程的状态
S:代表休眠状态;
D:代表不可中断的休眠状态;
R:代表运行状态;
Z:代表僵死状态;
T:代表停止或跟踪状态。
%CPU :该进程自最近一次刷新以来所占用的CPU时间和总时间的百分比
%MEM :该进程占用的物理内存占总内存的百分比。
TIME+:该线程启动以来,占CPU的时间
常见用法:
top -d 3 //每三秒刷新一次数据 默认是每5秒刷新一次数据
Ctrl+L //擦除并且重写屏幕。
概念详解:
load average:
可以理解为每秒钟CPU等待运行的进程个数.
在Linux系统中,sar -q、uptime、w、top等命令都会有系统平均负载load average的输出,那么什么是系统平均负载呢?
系统平均负载被定义为在特定时间间隔内运行队列中的平均任务数。如果一个进程满足以下条件则其就会位于运行队列中:
- 它没有在等待I/O操作的结果
- 它没有主动进入等待状态(也就是没有调用'wait')
- 没有被停止(例如:等待终止)
# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。
平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,那么平均等待时间可以这样计算:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数
应用到上面的例子: 平均等待时间 = 5ms * (1+2+...+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。
每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。
一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。
delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz 值应为 2.23,而不是 22.35。
5.linux系统查找文件的命令?
linux下查找命令--查找文件--查找文件内容
1,在某个路径下查文件。
在/etc下查找“*.log”的文件
find /etc -name "*.log"
2,扩展,列出某个路径下所有文件,包括子目录。
find /etc -name "*"
3,在某个路径下查找所有包含“hello abcserver”字符串的文件。
find /etc -name "*" | xargs grep "hello abcserver"
或者find /etc -name "*" | xargs grep "hello abcserver" > ./cqtest.txt
4,网上摘抄的几个和查找文件或文件内容相关的命令详说:
正则表达式
\分别表示单词的开始和结束
ex: \ 以T或者t开头,om结尾的单词
正则表达式的元字符集:
1) ^行首 /^love/ 以love开头的行;
2) $行尾 /love$/ 以love结尾的行;
3) . /l..e/ 匹配所有这样的行,字母l后面紧跟任意两个字符然后是e的行
4) * 重复0次或者任意多次前面字符
5) [x-y] 字符范围
6) [^x-y] 排除字符范围
7) \ 转义字符
8) \ 界定单词的开头和结尾
9) \( \) 标记后面用到的匹配字符 \(love\)able \1er=loveable lover
10) x\{m,n\} 重复字符x至少m此,至多n次
---------------------------------------------------------------------------
---------------------------------------------------------------------------
grep家族
RE--regular expression; g: global; p: print
出了上面10种元字符集,grep还支持下面的RE
\w 字母或者数字
\W 非单词字符(标点符号)
+ 重复一个或者多个前面的字符
| 或 love(a:b)表示lovea或者lobeb
?单个字符
grep返回状态值($?) 0表示成功,1表示失败,2表示没有找到文件
rgrep递归访问目录树
---------------------------------------------------------------------------
ls -l |grep ^d 显示目录
grep -n -v -# -A# -B#
-i 不区分大小写
-n 显示匹配行和行号
-v只显示不匹配行
-#显示匹配行上下#行
-A#匹配行后面打印#行
-B#匹配行前面打印#行
-c 只输出匹配行的行数
-h 查询多文件的时候不显示匹配的文件名字
-l 查询多文件只显示匹配的文件名
-s 不显示错误信息
grep与正则表达式同用
grep "^[^abc]" *.f 提取行首不是abc的行
grep "[0-9]\{3\}[8]" *.f 提取类似xxx8的行,x表示任意数字
grep "a\{2\}" *.f 显示a至少出现两次的行,注意grep是以行处理单位的
grep -n "^$" file 列出空行的行号
-E参数,可以使用"与"和"或"模式
grep -E "abc | def" *.f 显示包含abc或者def的行
ex:
ls -l | grep "^$" 显示目录
ls -l | grep "^d" 显示文件
ls -l | grep "^d..x..x..x" 显示特定权限的目录
ps aux | grep "httpd" |grep -v "grep"
---------------------------------------------------------------------------
---------------------------------------------------------------------------
**使用find和xargs
1. find pathname -options [-print -exec -ok]
-optinos
1)-name:按照文件名查找
find ~ -name "*.txt" -print
find ~ -name "[a-z][0-9].txt" -print
2)-perm:按照权限查找文件
find ~ -perm 755 -print 查找权限为755的文件
find ~ -perm 007 -print 查找o位置上具有7权限的文件
find ~ -perm 4000 -print 查找具有suid的文件
3)-prune
不在当前目录下查找
4)-user和-nouser
find ~ -user zhao -print 查找文件属主是zhao的文件
find ~ -nouser -print 查找文件属主已经被删除的文件
5)-group和-nogroup
find ~ -group zhao -print 查找文件群组是zhao的文件
6)按照时间
find ~ -mtime -5 -print 文件更改时间在5天内的文件
find ~ -mtime +3 -print 文件更改时间在3天前的文件
find ~ -newer file1 -print 查找比文件file1新的文件
7)按照类型查找
find ~ -type d -print 查找所有目录
8)按照大小
find ~ -size +1000000C -print 查找文件大小大于1000000字节(1M)的文件
9)查找位于本文件系统里面的文件
find / -name "*.txt" -mount -print
-exec,-ok:find命令对于匹配文件执行该参数所给出shell命令,相应命令形式为: 'command' {} \;
-ok 在执行命令前要确认
find ~ -type f -exec ls -l {} \;
find / -name "*.log" -mtime +5 -ok rm {} \;
find . -name core -exec rm {} \;
使用-x dev参数
防止find搜索其他分区
find . -size 0 -exec rm {} \;
删除尺寸为0的文件
2. xargs与-exec功能类似
find ~ -type f | xargs ls -l
find / -name "*.log" -type f -print| xargs grep -i DB0
find . -type f |xargs grep -i "Mary"
在所有文件中检索字符串Mary
ls *~ |xargs rm -rf
删除所有以~结尾的文件
---------------------------------------------------------------------------
---------------------------------------------------------------------------
SED:
=====
sed [options] sedcommand inputfile >outputfile
sed不接触初始输入文件,对其不做修改,若想保存改动,重要将输出重定向到一个文件即可
a\: 当前行后面加入一行或者文本
c\: 用信文本替换本行的文本
d: 删除一行
D: 删除模板块的第一行
i\: 在当前行上面插入文本
h: 拷贝模板块的内容到内存缓冲区
H: 追加模板块的内容到内存缓冲区
g: 获得内存缓冲区内容,并替换当前模板中的文本
G: 获得内存缓冲区内容,并追加到当前模版块文本的后面
n: 读取下一个输入行,用下一个命令处理新行而不是第一个命令
N: 追加下一个输入行到模版块后面,并在二者间插入一个新行,改变当前行的号码
p: 打印模板块的行
P: 打印模板块的地一行
q: 退出sed
r file: 从file中读行
!: 表示后面的命令对所有没有选中的行起作用
s/re/strint/: 用string替换正则表达式re
=: 打印当前行号
#command: 把注释扩展到下一个换行符号前
l 打印匹配行,包括显示控制符号
**替换标记
g: 行内全部替换
p: 打印行
w: 把行写入一个文件
x: 互换模板块和缓冲区中的文本
y: 把一个字符翻译成另外一个字符
**sed中元字符可以使用正则表达式中所有的
新加:
& 保存搜索字符 s/love 用**love**代替love
**sed定位文本的方式
x 行号
x-y 从x行到y行
/patern/ 查询包括patern的行
x,y! 不包括指定x-y行号的行
ex:
sed '/Tom/d' file
删除包含Tom的行;
sed '/Tom/!d' file
删除所有不包含Tom的行;
sed -n /north/p' file
打印包含north的行;
sed ‘3d' file
删除第三行;
sed '3,$d' file
删除第三行到最后一行;
sed '$d' file
删除最后一行;
sed '/north/d' file
删除包含north的行;
sed -n 's/west/north/g' file
替换所有west为north;
sed -n 's/^west/north/p' file
一行的开头的west用north替换,并打印发生替换的行;
sed 's/[0-9][0-9]$/&.5/' file
所有以两个数字结尾的行,最后两个数字被他们自己替换并附加.5;
sed -n 's/\(Mar\)got/\1ianne/p' file
将Margot替换为Marianne,并打印发生替换的行;
sed 's#abc#ABC#g' file
所有abc由ABC替换,(所有s后面紧跟的字符都被认为是新的分隔符);
sed '/west/,/east/p' file
打印包含west行和包含east行中间的所有行;
sed '1,/east/s/$' file
地一行和包含east行之间的所有行的行尾加上字符串**A**;
sed -e '1,3d' -e 's/aa/bb/' file
先删除1到3行,然后用bb替换aa;
sed '/Sam/r file1' file
将文件file1中的内容附加在包含Sam的行后面;
sed '/Sam/w file1' file
将还有Sam行写入文件file1中;
sed '/^north /a\new line second line' file
所有以north加空格开头的行后面附加上两行文本,a\表示追加文本,\表示换行(tcsh中需要,bash中不需要);
sed '/^north/i\new line' file
在行首为north的行前面插入一个新行;
sed '/norht/{n; s/aa/bb/;}' file
首先匹配含有north的行,然后执行一组命令,n表示移到下一行,并用bb代替aa;
sed '1,3g/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file
将1到3行中的所有小写字母用大写字母替换;
sed '/Lewis/{s/Lewis/bbb;q;}' file
首先找到匹配Lewis的行,然后用bbb代替Lewis,接着q退出seq;
sed -e '/north/h' -e '$G' file
首先找到包含norht的行,h拷贝到内存缓冲区,然后到文件随后一行($),G附加在最后一行后面;
sed -e '/we/{h;d;}' -e '/ct/{G:}' file
查找包含we的行,拷贝并且删除他,然后查找包含ct的行,将拷贝内容附加到他后面;
sed -e '/north/h' -e '$g' file
首先找到包含norht的行,h拷贝到内存缓冲区,然后到文件随后一行并覆盖他;
sed -n 'l' file
打印所有包含不能打印字符的行。
sed -n '/.*ing/p' file
显示含有以ing结尾单词的行;
sed -n '/music/=' file
打印含有music的行号;
sed '^$d' file
删除空行
sed 's/^/abcd/g' file
在行首填加abcd
sed 's/$/abcd/g' file
在行尾填加abcd
sed 's/rm$/played &/g' file
&表示在替换的时候保留被替换的词(rm--played rm)
sed 's/^M//g' file
去掉行尾的^M (^M的输入,先按ctrl+v然后按enter即可即可)
---------------------------------------------------------------------------
---------------------------------------------------------------------------
gawk程序:
awk [-F 域分隔符] 'commands' inputfile
awk执行时,其域标志符为$1,$2,$3.........$n,$0表示所有的域
awk -v var=value 赋值给一个用户定义的变量
awk 'pattern' file
awk '{action}' file
awk 'pattern {action}' file
ex:
awk '{print $0}' file
打印所有的域
awk '/Mary/' file
打印包含file中包含Mary的行;
awk '{print $1}' file
打印文件的第一列(第一个域);
awk '/Mary/ {print $1,$2}' file
打印文件file包含Mary的行的第一和第二个域;
df | awk 'S4>75000'
打印可用空间大于75000的文件系统
date | awk '{print " month:", $2, "\n year:" $6}'
格式化date的输出;
awk 'BEGIN{OFMT="%.2f"; print 1.25463}'
指定数字输出格式,小数点后面保留两位有效数(1.25);
awk '/[ab]cdef/' file
打印匹配acdef或者bcdef的行;
awk '{print NR, $0}' file
awk '{print $0, NR}' file
NR当前记录数,每处理一个记录NR就加1
上面的命令相当于在每一行后面加上一个行号;
NF则记录每一行的域的个数;
awk -F '[ :\t]' '{print $0}' file
指定域分隔符为空格、:或者tab
awk '/^[A-Z][a-z]+/' file
打印所有以一个大写字母开头,然后是一个或者多个小写字母的行;
awk '$1~/[Bb]ill/' file
第一个域匹配Bill或者bill的行;
awk '$1!~/ly$/' file
第一个域末尾不是ly的行;
awk '/^(No|no)/' file
打印行首为No或者no的行;
awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file
awk 'BEGIN {print "file head \n"} {print $1 \t $4}' file |tee out.file
打印文件的时候附加一个文件头
awk 'BEGIN {print "file head \n"} {print $1 \t $4} END {print "end of file"}' file
打印文件的时候附加一个文件头和文件尾
awk中使用正则表达式
awk '{if($1~/hello/) print $0}' file
如果域1中包含hello,就打印所有的域
~//表示匹配正则表达式,!~//表示不匹配正则表达式
awk '{if($6,>=,==,!=,~,!~(匹配,不匹配)
awk ‘$3==5346' file
第三个域等于5346,就打印出该行;
awk '$3>5000 {print $1}' file
第三个域大于5000就打印该行第一个域
awk '{max={$1>$2}?$1:$2; print max}' file
如果第一个域大于第二个域,max=$1否则=$2,打印最大值
awk '{print ($1==11?"high\t" $2:"low\t" $2)}' file
&&逻辑和,||逻辑或,!逻辑非
awk '$2==$5 && $3>5' file
awk '/Tom/,/Jary/' file
Tom第一次出现和Jary第一次出现之间的所有行;
awk '/north/ {print $3+10}' file
包含north行的地三个域加10;
awk '$3=="aa" {$2="dd"; print $0}' file
将地三个域为aa的行的第二域变成dd,并打印该行;
**awk编程:
使用变量
awk '$1~/Tom/ {wage=$2+$3; print wage}' file
先扫描第一个域,如果匹配Tom,就将第二和第三域的总和赋值给变量wage并输出;
awk 'BEGIN{FS=":"; OFS="\t";ORS="\n\n"}{print $0}' file
处理文件前设置
域分隔符(FS)为(:)
输出域分隔(OFS)为(\t)
输出记录分隔符(ORS)为(\n\n)
awk 'END{print "The number of record is:' NR}' file
处理完文件后执行END语句
输出总记录数
awk '/Mary/{count++} END{print "Mary was found" count "times"}' file
计数文件中Mary出现的次数;
**awk输入输出重定向
awk '$4>=70 {print $1, $2 >"outfile"}' file
结果重定向到文件outfile中
awk 'BEGIN{"date" |getline d; print d}'
将date结果输给getline函数,并打印
(getline从标准输出,管道等获得输入)
awk 'BEGIN{"date" |getline d; split(d,mon); print mon[1] mon[2]}'
将date结果输给getline函数,slpit将d分解成数组,打印数组第2个变量
**split函数:split(string,array,field seperator)
awk 'BEGIN{while("ls"|getline) print}'
依次输出ls的每一项
awk
'BEGIN{print "what is your name?"; getline name 0) {lc++; print lc " " a}}'
awk 'BEGIN{while(getline a 0) {lc++; print lc}}'
如果文件不存在,getline返回-1
到达文件尾返回0
读到一行返回1
读取文件/etc/passwd,计数行数
**awk控制语句
if语句:
awk '{if($6>50) print $1 "too high"}' file
awk '{if($6>20 && $250}{x++; print x} else {y++;print y}' file
awk '{if($1~/peter/){next} else {print}}' file
如果第一个域包含peter,awk就忽略这一行,读取文件的下一行,脚本从头开始执行;
循环语句:
awk '{i=1; while(i file
cat -v file 显示文件,包括其中的控制符(-v)
cat -n file 为每一行编号
cat -b file 每个非空行编号
cat -T file 以^I显示tab
3.
管道 | 把一个命令的输出传递给另外一个命令为输入
ex:
ls | grep file.doc
查找文件file.doc
who | awk '{print $1 "\t" $2}' 只显示用户名和所在终端
df -h | awk '{print $1}' |grep -v "filesystem" (-v表示输出不包括filesystem的项目)
df -h | awk '{print $1}' |grep -v "filesystem" |sed 's/\/dev\///g' 显示设备的时候不显示/dev/
4.tee
who | tee who.txt 输出到屏幕的同时输出到文件
who | tee -a who.txt 附加在文件的后面
5.文件重定向
ls -l |grep ^d >file.out 所有目录名字重定向到一个文件
cat /etc/passwd | awk -F: '{print $1}' |sort >a.out (-F:指定分隔符为:)
cat >file.out reboot
at> ctrl+D
3小时后reboot
3.
bc - 计算器
scale=3 设置小数点后数字为数
ibase=2 二进制运算
4.
ls -d dir
只显示目录而不显示其下面的文件。
5.
sync
更新superblock并把它写入硬盘
6.
scp
服务器间拷贝文件
6.linux系统定时处理的命令?
1.命令简介
每个用户都有各自不同的计划任务列表,用各自的帐户登录后运行
crontab -l
就可查看到各任务的计划任务情况,使用下列命令可以修改自己的计划任务
crontab -e
每次添加完任务后,一定记得重新启动crond服务,不然不会生效
service crond restart
2.实例
下面为一计划任务的样例
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
上面这句的意思是“每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点显示时间”,你把date改成你想执行的命令,再把执行的时间改了,就可以形成一个定时执行命令了
#每分钟执行一次
*/1 * * * * date
#在/root/run_sh/下面写一个shell脚本,命名为run.sh,内容如下
#!/bin/sh
echo hello > /root/Hello.txt
然后运行crontab -e命令,写入
*/1 * * * * /root/run_sh/run.sh(一定要绝对路径)
保存退出后执行service crond restart,过一分钟后你就会在/root下看到Hello.txt文件。
#定时运行java程序,写一命名为run.sh的shell脚本,内容如下
#!/bin/sh
cd /root/javaExe/
java TestCron/Test
后运行crontab -e 写入
*/1 * * * * /root/run_sh/run.sh(一定要绝对路径)
后重启crond服务。
3.空格之间的参数意义如下
分钟 小时 天 月 星期 要执行的命令
前面五个参数中间用空格隔开,最后是要执行的命令。
详细的请参考下面(转载)
=================================
Crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序
使用cron服务,用 service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它,
cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
编辑/etc/crontab文件,在末尾加上一行: 30 5 * * * root init 6 这样就将系统配置为了每天早上5点30自动重新启动。
需要将crond设置为系统启动后自动启动的服务,可以在/etc/rc.d/rc.local 中,在末尾加上
service crond start
如果还需要在系统启动十加载其他服务,可以继续加上其他服务的启动命令。
比如: service mysqld start
基本用法:
1. crontab -l
列出当前的crontab任务
2. crontab -d
删除当前的crontab任务
3. crontab -e (solaris5.8上面是 crontab -r)
编辑一个crontab任务,ctrl_D结束
4. crontab filename
以filename做为crontab的任务列表文件并载入
crontab file的格式:
crontab 文件中的行由 6 个字段组成,不同字段间用空格或 tab 键分隔。前 5 个字段指定命令要运行的时间
分钟 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
星期几(0-6,其中 0 代表星期日)
第 6 个字段是一个要在适当时间执行的字符串
例子:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点10分
10 6 * * * date
#每两个小时
0 */2 * * * date (solaris 5.8似乎不支持此种写法)
#晚上11点到早上8点之间每两个小时,早上8点
0 23-7/2,8 * * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date
#1月份日早上4点
0 4 1 jan * date
补充:在使用crontab的时候,要特别注意的是运行脚本中能够访问到的环境变量和当前测试环境中的环境变量未必一致,一个比较保险的做法是在运行的脚本程序中自行设置环境变量(export)
(1)先建一个文件crond.txt如下, 每天早上5点36分重新启动
36 5 * * * reboot
(2)上传到/opt目录
(3)运行命令
crontab /opt/crond.txt
crontab -l
让配置文件生效:如果让配置文件生效,还得重新启动cron,切记,既然每个用户下的cron配置文件修改后。也要重新启动cron服务器。
在Fedora 和Redhat中,我们应该用;
[root@localhost ~]# /etc/init.d/crond restart
如果让crond 在开机时运行,应该改变其运行级别;
[root@localhost ~]# chkconfig --levels 35 crond on
service crond status 查看 cron服务状态,如果没有启动则 service crond start启动它, cron服务是一个定时执行的服务,可以通过crontab 命令添加或者编辑需要定时执行的任务
下面是一个例子文件:
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
#每天早上6点
106* * * date
#每两个小时
0*/2* * * date
#晚上11点到早上8点之间每两个小时,早上部点
0 23-7/2,8* * * date
#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4* mon-wed date
#1月份日早上4点
0 4 1 jan* date
范例
lark:~>crontab-1 列出用户目前的crontab.
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND
10 6* * * date
0*/2* * * date
0 23-7/2,8 * * * date
lark:~>