Linux面试题
http://coolshell.cn/articles/9104.html
http://blog.csdn.net/sunboy_2050/article/details/7303501
sed的替换功能比较简单:
sed
"s/my/Hao Chen's/g"
pets.txt
注意:如果你要使用单引号,那么你没办法通过\’这样来转义,就有双引号就可以了,在双引号内可以用\”来转义。
再注意:上面的sed并没有对文件的内容改变,只是把处理过后的内容输出,如果你要写回文件,你可以使用重定向,如:
1
|
$
sed
"s/my/Hao Chen's/g"
pets.txt > hao_pets.txt
|
或使用 -i 参数直接修改文件内容:
1
|
$
sed
-i
"s/my/Hao Chen's/g"
pets.txt
|
在每一行最前面加点东西:
1
2
3
4
5
6
7
8
9
|
$
sed
's/^/#/g'
pets.txt
#This is my cat
# my cat's name is betty
#This is my dog
# my dog's name is frank
#This is my fish
# my fish's name is george
#This is my goat
# my goat's name is adam
|
在每一行最后面加点东西:
1
2
3
4
5
6
7
8
9
|
$
sed
's/$/ --- /g'
pets.txt
This is my
cat
---
my
cat
's name is betty ---
This is my dog ---
my dog's name is frank ---
This is my fish ---
my fish's name is george ---
This is my goat ---
my goat's name is adam ---
|
大小写转换:
第一种方法:tr命令
tr -- translate or delete characters
转换成小写的时候就是tr A-Z a-z
# cat |tr a-z A-Z
第二种方法:sed命令
# cat |sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
好ugly的方法,有点辱没Linux了.
第三种方法:awk语言
# cat |awk '{print toupper($0)}'
对应的转换成小写的做法是把toupper函数替换成tolower函数.
第四种方法:Perl语言
# perl -e '$_=<STDIN>;chomp;s/(.*)/U$1/;print $_;'
对应的转换成小写的做法是替换s/(.*)/U$1/为s/(.*)/L$1'再运行.
查看本机ip
ifconfig |
/sbin/ifconfig
df -f 查看磁盘容量和使用情况
iconv -f from-encoding -t to-encoding inputfile -o outputfile
查看网络端口使用情况
除了一个文件外,其他文件都要拷贝
cp -r $(find -maxdepth 1 ! -name 'nightly.html' | sed 1d) ../tmp
sed 1d的作用是删除第一行的"."
sed -n 'np' text 输出第n行
sed -n 'n,mp' text 输出第n~m行
sed -n 'n,$p' test 输出第n行之后的
方法一:ps -ef | grep 程序名
方法二:netstat -nltp | grep 端口号或服务名
方法三:netstat -antup | grep 端口号
方法四:netstat -an | grep 端口号
netstat -nlp | grep 端口号
如果有,则在最后一列有占有此端口号的进程号
netstat -nlp | grep 进程号
就可以看到占有的端口
用 netstat -apn | grep 貌似更准确
top -u username 然后键入c,就能看到这个用户的所运行程序的详细情况
tail -f 就能实时看到写入到文件中的内容
head -n 1 /etc/issue # 查看操作系统版本
file
file -bi
显示文件的编码
在实用svn diff时,如果不希望显示出资源文件的内容,可以把这个文件加上二进制的属性
svn propset svn:mime-type application/octet-stream <filename>
也可以将其属性变为文本格式
text/plain
不用解压查看压缩包文本内容:
zcat/gzip tt.tar.gz | less
gzip/zcat -dc tt.gz | less
在top指令下
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
其中RES指程序所占的总内存,以KB为单位
cat /proc/13722/status 可以看程序栈空间使用大小
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm)
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm)
VmStk(KB) 任务在用户态的栈的大小 (stack_vm)
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code)
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE 该进程的所有页表的大小,单位:kb
grep -nr 'vector' src/XXXX/ | awk '{if (!match($0,/\.svn/, a)) print $0 }'
输出所有文件汇总含有vector的地方,但是如果是在.svn目录下就不输出
grep -nr 'vector' src/XXXX/ | awk '$0 !~ /\.svn/'
locate filename
从根目录开始输出所有目录或者文件包含filename的完整绝对路径
ps U username
显示用户username创建的进程
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题
find ~ -name ‘*.log’ -print0 | xargs -0 rm -f
2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l
# find /etc -name "*.conf" | xargs ls –l
3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat url-list.txt | xargs wget –c
4. 查找所有的jpg 文件,并且压缩它
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
5. 拷贝所有的图片文件到一个外部的硬盘驱动
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
如果启动了多进程如何杀死?
ps aufx|grep 命令名|grep user|awk ‘{print $2}’|xargs kill -9
killall -u userid
注意这两条指令要慎用
将后缀为.cpp的都改为.cc
rename .cpp .cc *.cpp
copy 本地的档案到远程的机器上
scp /etc/lilo.conf root@192.168.0.1:/home/k
会将本地的 /etc/lilo.conf 这个档案 copy 到 192.168.0.1,使用者 root 的/home/k目录下。
copy远程机器上的档案到本地来
scp root@192.168.0.2:/etc/lilo.conf /etc
会将 192.168.0.2 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。
保持从来源 host 档案的属性
scp –p k@net67.ee.tw:/etc/lilo.conf /etc
如果想使用特定端口 使用 scp –p(大写) 如 scp –p 1234 k@net67.ee.tw:/etc/lilo.conf /etc
http://coolshell.cn/articles/9070.html
awk
df –h 显示磁盘的使用信息
last 读取用户登录信息
lastlog 显示所有用户的登录信息,每个用户只显示一条
free –m 内存使用情况
iostat 系统io情况
sar 显示服务器的性能信息
netstat 显示端口使用信息
无密码穿梭服务器:keychain或者ssh-agent加载密钥,然后用ssh直接登录其他服务器
更改与文件关联的所有者或组。
语法
chown [ -f ] [ -h ] [ -R ] Owner [ :Group ] { File ... | Directory ... }
chown -R [ -f ] [ -H | -L | -P ] Owner [ :Group ] { File ... | Directory ... }
描述
chown 命令将 File 参数指定的文件的所有者更改为 Owner 参数指定的用户。Owner 参数的值可以是可在 /etc/passwd 文件中找到的用户标识或登录名。还可以选择性地指定组。Group 参数的值可以是可在 /etc/group 文件中找到的组标识或组名。
只有 root 用户可以更改文件的所有者。只在您是 root 用户或拥有该文件的情况下才可以更改文件的组。如果拥有文件但不是 root 用户,则只可以将组更改为您是其成员的组。
more /proc/cpuinfo 查看cpu数量和信息
less 比more更强大,类似于vi,可以打开多个文件,并有搜索功能
Top:
按1,查看所有cpu状态
Shift+m, 按内存排序
Ps:
Ps ux
Ps aux
Ps auxf
du –h 各个目录占用空间
du -h --max-depth=2
crontab 定时任务
history 查看历史指令
cut -d' ' -f1-7,9- tt >tt1 删除文件tt中的第8列,9-表示从第9列到最后一列
-d是指定列的分隔符
sed -e '4d' 删除第4行
sed -e '4,7d' 删除4-7行
awk 'BEGIN{n=0}{if (/","/) n++; if (n%2==0) print n}END{print n}' t.cc
开始设n值为0,如果一行出现字符串"," n加一,最后输出一共多少行出现了字符串","
注意:awk中只能出现一对单引号,{}大括号中放入的是类c的代码语句,要以分号区分语句
awk '$1 ~ /n/' testfile
~表示的是匹配,如果第一列中有字符n则,输出这一行
awk '$1 !~ /n/' testfile
输出第一列中不含n的行
2.txt文本文件如下
118.77.0.113
118.77.0.113
124.236.37.121
124.236.37.121
118.77.0.113
211.142.94.2
180.18.96.3
180.18.96.3
118.77.0.113
118.77.0.113
180.18.96.3
180.18.96.3
61.128.250.170
61.128.250.170
要得到的结果
5 118.77.0.113 (即重复行数和 IP )、
awk '{a[$1]++}END{for (j in a) print a[j],j}'
awk '{ split($0, t, " "); for (s in t) a[t[s]]++;} END{for (s in a) print a[s], s}' train.t > key.s
cat train.t
aa 11 23 444
bbb tt rr adf
cc tt rr 11
aa
cc d
ddd g
eee d
ff ddd
bbb ff
key.s中统计的是单词的次数
awk中用到的数组都是关联数组,split得到的数组t,其key是整数,其value是字符串
关联数组a,其key是字符串,其value是次数
awk '{split($0, arr);for(a in arr) term[arr[a]]++}END{for(t in term) print t, term[t]}' part | sort -nr -k 2 > all
统计文本part中所有单词出现的次数,并逆序输出
awk -F '|||' '{if( !match($1,/^<s>/,a) && !match($1,/<\/s>$/,b)) print $0 }' final_rules > fin1
按照|||进行切分,将第一个字段中的首尾不是<s></s>的整句输出到fin1
上面的指令的意思是遇到一个|就分段,要这样写才行
awk -F '\\|\\|\\|'
统计文本中不同词的个数
awk '{split($0,t," "); for (s in t ) a[t[s]]++;}END{print length(a)}' t1
length计算关联数组的长度
awk不支持空格\s
awk '{if (match($0, /[a-z][[:space:]]+[a-z]/, a)) print $0}' cc.txt
或者
awk '{if (match($0, /[a-z] +[a-z]/, a)) print $0}' cc.txt
//可以这样使用match($0,/[a-z] +[a-z]/)
注意的是:
1. $NF 表示最后一个字段,而NF表示一共有多少个字段,也就是说$表示的是第几个字段
2. 在'{}'这里面,不能用单引号表示字符串,会引起歧义,要用双引号
ll | awk '{print $NF}' | sed -n '2,$p'|xargs identify | awk '{if ($3 != "28x28") print $1}'
这个目录下都是图片,如果有一张图片的尺寸不是28x28,就输出这个图片的名字
awk -F ':' '{print $1}' tt 将按照“:”分割的第一个字段输出
NF 如果当前行是非空行,返回true。这里的非空行,也包括一行中全是空格或者tab。
NF 表示一行有多少个字段
awk '{if (NF == 3) print $0}' 只输出有三个字段的行
awk '{print $NF}' 只输出最后一个字段
awk 'NF-=1' 不输出最后一个字段
awk 'NF-=2' 不输出最后两个字段
awk '{$NF="";print}' 不输出最后一个字段
awk '{if (substr($NF,1,1)=="-") print $0 }' 如果最后一个字段的第一个字母是'-', substr下标从1开始,第三个参数是要截取的长度
awk ‘/./’ 只输出非空行,这里的非空行也包括一行中全是空格或者tab
awk NF 输出的是过滤了空行的文本
awk '{if (!NF) print NR}' tt 输出空行的行号
在{}中的语句是不会主动输出匹配行的,所以在{}内,一旦有输出就要用print
譬如:awk '1; {print ""}' tt 处理一行,输出,1是true,满足条件,所以在输出一个空行
awk '{if (1) print ""}' tt 就只会输出空行了
awk '1; {print "\n"}' tt
awk '{print NR "\t" $0}' tt 在每一行添加行号
awk 'END {print NR}' 模拟 wc –l
输出文本中4-7行
awk '{if (NR >=4 && NR <= 7)print $0; if (NR >7) exit}' tt
awk '{if( match($0,/[0-9]+\.[0-9]*/,a))print a[0]}' tt
查找并输出文件中的小数
$0是指整行
awk '{if ( match($0,/<u>.+<\/u>/,a)) print NR}' Page_gbk.txt
输出含有<u>XXX</u>这样的模式的行号
awk有比较坑的地方,就是无法正常匹配单引号', 对于双引号可以通过\"进行匹配,单引号只能通过\047匹配
awk '{if ( match($0, /\\\047\\\047\\\047.+\\\047\\\047\\\047/, a) ) print NR}' Page_gbk.txt
输出含有\'\'\'XXXX\'\'\'的行号
awk '{gsub(/\)/,")");print}' tt >t1
awk '{gsub(/\(/,"(");print}' t1 >t2
find . -name '*.scala' | awk '{if (!match($0, /-test/,a)) print $0}' | xargs wc -l | sort -n
统计有效的代码行数,过滤test目录
删除文件中所有的偶数行
awk 'NR %2 ==1' tt
awk和sed即使功能再强大,但是有一点不行,就是他们的正则表达式不支持非贪婪形式,比如,我们要将<.*>之类的标签去除,一般会用非贪婪形式的<.*?>就是?后面的字符只要出现就停止,但是awk,sed不支持
我们可以变通
sed -i 's/<[^>]*>/ /g' tt.txt
head -7 tt | tail -4
awk -F ':' '{if (/processor/ &&!/0/) print $0}' tt 首先按照“:”分为域,当前行必须有“processor”并且不包括“0”才输出
awk -F '_' '{print $0" "substr($NF,0,index($NF,".")-1)}' 注意,string在awk中下标是从1开始的,index是查找函数,substr(s,beg, n), n是从beg开始的n个字符
grep -wf f1.txt f2.txt 输出两个文件中相同的行
grep –wvf f1.txt f2.txt输出f2中不是共有的行
grep –wvf f2.txt f1.txt输出f1中不是共有的行
sort a b 对两个文件的行进行排序
sort a b | uniq 取出两个文件的并集(重复的行只保留一份)
sort a b | uniq –u 删除交集,留下其他的行
sort a b| uniq –d 取出两个文件的交集
sort a b b|uniq -u 只保留仅在a中出现的行
打印单个文件重复的行是
sort a | uniq -d
主要是看uniq命令,sort a b c也只是把这三个文件输出并无区别排序
uniq
-d 只显示重复的行
-u 只显示不重复的行
psaux |sort -rn –k 4|head -1|awk '{ print $2 }'
psaux指令是将服务器内所有进程列出来
sort
-r逆序排列
-n将字段作为数字
-d按照字典顺序排序
-kn按照第n个字段排序,注意这里是从1开始
awk打印字段,从0开始
python使用正则表达式
m = re.search('[^abcd]+',"acav")
if m is not None:
print m.group()
去掉行中的空格
去掉所有行的空格
sed -i ’s/ //g’ df.txt(注意这个指令是对原文本进行操作)
去掉所有行的空格
sed -e ’s/ //g’ df.txt >cwm.txt
|
只显示指定行范围的文件内容,例如:
sed -n '100,200p' mysql_slow_query.log
切分大文件
split -l 2 -d tt tt.
按照每2行切分文件tt,后缀以数字作为后缀
还可以按照文件大小进行切分
Linux下多线程查看工具(pstree、ps、pstack)
1. pstree
pstree以树结构显示进程
$ pstree -p work | grep ad
sshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552)
|-{ad_preprocess}(4553)
|-{ad_preprocess}(4554)
|-{ad_preprocess}(4555)
|-{ad_preprocess}(4556)
`-{ad_preprocess}(4557)
work为工作用户,-p为显示进程识别码,ad_preprocess共启动了6个子线程,加上主线程共7个线程
2. ps -Lf
$ ps -Lf 4551
UID PID PPID LWP C NLWP STIME TTY STAT TIME CMD
work 4551 22670 4551 2 7 16:30 pts/2 Sl+ 0:02 ./ad_preprocess
work 4551 22670 4552 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
work 4551 22670 4553 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
work 4551 22670 4554 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
work 4551 22670 4555 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
work 4551 22670 4556 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
work 4551 22670 4557 0 7 16:30 pts/2 Sl+ 0:00 ./ad_preprocess
进程共启动了7个线程
3. pstack
pstack显示每个进程的栈跟踪
$ pstack 4551
Thread 7 (Thread 1084229984 (LWP 4552)):
#0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6
#1 0x00000000006f0730 in ub::EPollEx::poll ()
#2 0x00000000006f172a in ub::NetReactor::callback ()
#3 0x00000000006fbbbb in ub::UBTask::CALLBACK ()
#4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#6 0x0000000000000000 in ?? ()
Thread 6 (Thread 1094719840 (LWP 4553)):
#0 0x000000302afc63dc in epoll_wait () from /lib64/tls/libc.so.6
#1 0x00000000006f0730 in ub::EPollEx::poll ()
#2 0x00000000006f172a in ub::NetReactor::callback ()
#3 0x00000000006fbbbb in ub::UBTask::CALLBACK ()
#4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#6 0x0000000000000000 in ?? ()
Thread 5 (Thread 1105209696 (LWP 4554)):
#0 0x000000302b80baa5 in __nanosleep_nocancel ()
#1 0x000000000079e758 in comcm::ms_sleep ()
#2 0x00000000006c8581 in ub::UbClientManager::healthyCheck ()
#3 0x00000000006c8471 in ub::UbClientManager::start_healthy_check ()
#4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#6 0x0000000000000000 in ?? ()
Thread 4 (Thread 1115699552 (LWP 4555)):
#0 0x000000302b80baa5 in __nanosleep_nocancel ()
#1 0x0000000000482b0e in armor::armor_check_thread ()
#2 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#3 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#4 0x0000000000000000 in ?? ()
Thread 3 (Thread 1126189408 (LWP 4556)):
#0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6
#1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6
#2 0x000000000044c972 in Business_config_manager::run ()
#3 0x0000000000457b83 in Thread::run_thread ()
#4 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#5 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#6 0x0000000000000000 in ?? ()
Thread 2 (Thread 1136679264 (LWP 4557)):
#0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6
#1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6
#2 0x00000000004524bb in Process_thread::sleep_period ()
#3 0x0000000000452641 in Process_thread::run ()
#4 0x0000000000457b83 in Thread::run_thread ()
#5 0x000000302b80610a in start_thread () from /lib64/tls/libpthread.so.0
#6 0x000000302afc6003 in clone () from /lib64/tls/libc.so.6
#7 0x0000000000000000 in ?? ()
Thread 1 (Thread 182894129792 (LWP 4551)):
#0 0x000000302af8f1a5 in __nanosleep_nocancel () from /lib64/tls/libc.so.6
#1 0x000000302af8f010 in sleep () from /lib64/tls/libc.so.6
#2 0x0000000000420d79 in Ad_preprocess::run ()
#3 0x0000000000450ad0 in main ()