1.1创建一个目录/data。
1) 解答: mkdir /data
扩展:mkdir后面可以加参数-p,表示递归创建,也可以加参数-v,表示可以显示出创建的过程。
1.2为oldboy.txt增加内容为“I am studying linux.”。
解答:为文件增加内容目前有三种方法:
1) 用echo的方式追加内容:echo "I am studyinglinux"> /data/oldboy.txt
2) 用vi编辑器追加内容:vi /data/oldboy.txt ##进入vi后输入i,进入编辑模式,输入要追加的内容,然后按esc键退出。
3) 用cat和eof配合输出
cat >>/data/oldboy.txt <<eof
> I am studying enhlish
> eof
1.3已知文件test.txt内容为:
test
liyao
oldboy
请给出输出test.txt文件内容时,不包含oldboy字符串的命令。
解答:此题有几种解法
1) 利用head取文件的前两行即可
2) 用grep过滤排除 ,-v参数表示反转过滤。
grep -v"oldboy" test.txt
1.4只查看ett.txt文件(共100行)内第20到第30行的内容
解答:
1) 利用head和tail结合取
head -30 ett.txt |tail -11
2) 利用sed命令
sed -n"20,30p" ett.txt
3) 利用awk命令
awk"NR>=20&&NR<=30" ett.txt
1.5把/oldboy目录及其子目录下所有以扩展名.sh结尾的文件中包含./hostlists.txt的字符串全部替换为../idctest_iplist。
解答:
方法一:find /root -type f -name "*.sh"|xargs sed -i ‘s#./hostlists.txt#../idctest_iplist #g‘
find用于查找文件,后面加参数-type 后面加文件类型,后面加要查询的文件名,-name;sed和xargs联合,加上sed –i‘s#替换前的内容#替换后的内容#g’
方法二:利用变量函数
第一步:创建测试环境
[[email protected] oldboy]# cat 5.sh
I am studying Linux
I am a goog boy
[[email protected] oldboy]# cd.
-bash: cd.: command not found
[[email protected] oldboy]# cd ..
[[email protected] ~]# pwd
/root
第二步:先用find找到文件find /root/oldboy -type f-name ‘*.sh‘
[[email protected] ~]# sed ‘s#am#123456#g‘ $(find /root/oldboy -type f -name ‘*.sh‘)
466
I 123456 studying Linux
I 123456 a goog boy
466
第三步:利用sed与‘s#替换前#替换后#g’先查看一下要别替换后的结果,$()的意思引用find的执行结果
[[email protected] ~]# sed ‘s#am#123456#g‘ $(find /root/oldboy -name ‘*.sh‘ -type f )
466
I 123456 studying Linux
I 123456 a goog boy
466
第四步:sed后面加上参数 -i ,实现最后替换。
[[email protected] ~]# sed ‘s#am#123456#g‘ -i $(find/root/oldboy -name ‘*.sh‘ -type f )
[[email protected] ~]# cat /root/oldboy/5.sh
I 123456 studying Linux
I 123456 a goog boy
[[email protected] ~]#
1.6如何查看/etc/services文件内容有多少行?
解答:
第一种:
[[email protected] oldboy]# cat -n/etc/services |tail -1
10774 iqobject 48619/udp # iqobject
[[email protected] oldboy]# ##所有可以查看行号的命令 + tail -1
第二种:
[[email protected] oldboy]# wc -l/etc/services
10774 /etc/services
生产场景中经常会通过wc -l计算服务进程个数等。然后通过脚本判断进程个数来检测服务是否正常,如进程数大于一个,说明进程还存在,服务一般就正常。
1.7如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录)?
解答:
1.7.1 第一种方法(tree -Ld 1)
[[email protected] data]# tree -Ld 1
.
├── niu
├── old
└── yu
3 directories
[[email protected] data]#
注:tree命令是以树的结构显示目录结构,参数‘-L’ ,主要用于显示目录结构的层数;参数‘-d’ 用于显示目录的。
1.7.2第二种方法
[[email protected] data]# ls -l |grep ‘^d‘
drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu
drwxr-xr-x 3 root root 4096 Mar 16 03:07 old
drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu
[[email protected] data]#
注:此题用了grep与管道过滤查询,先用ls -l查出所有的文件,其中包括文件和目录,然后用到了通配符^,它后面加名字,表示以名字开头的文件。
1.7.3第三种方法
[[email protected] data]#ll
total 16
-rw-r--r-- 1 root root 0 Mar 16 03:06 1
-rw-r--r-- 1 root root 0 Mar 16 03:06 2
-rw-r--r-- 1 root root 0 Mar 16 03:06 3
-rw-r--r-- 1 root root 0 Mar 16 03:06 44
-rw-r--r--. 1 root root 29 Mar 15 13:34 ett.txt
drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu
drwxr-xr-x 3 root root 4096 Mar 16 03:07 old
drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu
[[email protected] data]# ls-l |awk ‘$2>1‘
total 16
drwxr-xr-x 2 root root 4096 Mar 16 03:08 niu
drwxr-xr-x 3 root root 4096 Mar 16 03:07 old
drwxr-xr-x 3 root root 4096 Mar 16 03:07 yu
[[email protected] data]#
注:awk可以取列,利用变量$后面加列数可以实现,列如$2是取第二列,$6是取第六列。
1.7.4第四种方法
[[email protected] data]#find -maxdepth 1 -type d
.
./yu
./niu
./old
[[email protected] data]#
注:find是查询命令中很重要的,它和maxdepth可以查询目录的最大深度数,
-type 后面跟文件的类型,一般有普通文件,用f表示,目录文件用d表示。
-name 匹配某个名字
!-name 不匹配某个名字
find后面的参数是有顺序的,一般maxdepth放前面
[[email protected] data]# find -maxdepth 1 -type d !-name ‘.‘
-bash: !-name: event not found
[[email protected] data]# find -maxdepth 1 -type d !-name ‘.‘ ##注意!和后面的空格
-bash: !-name: event not found
[[email protected] data]# find-maxdepth 1 -type d ! -name ‘.‘
./yu
./niu
./old
[[email protected] data]#
1.7.5第五种方法
[[email protected] data]#ls -F|find -type d -name ‘$/‘
[[email protected] data]# ls -F
1 2 3 44 ett.txt niu/ old/ yu/
[[email protected] data]# ls -F|grep ‘$/‘
[[email protected] data]# ls-F|grep ‘/$‘
niu/
old/
yu/
[[email protected] data]#
注:find是搜索文件的,而grep一般用于搜索字母或文字的。ls -F 用来将文件末尾加上‘/‘。
1.8一个目录中有很多文件(ls -l查看时好多屏),想用一条命令最快速度查看到最近更新的文件。如何看?
解答:
[[email protected]~]# date
Thu Mar 16 05:28:51 CST 2017
[[email protected] ~]# mkdir oldboy2
[[email protected] ~]#ls -lrt
total 64
-rw-r--r--. 1 root root 5890 Mar 10 09:39 install.log.syslog
-rw-r--r--. 1 root root 21764 Mar 10 09:42install.log
-rw-------. 1 root root 1073 Mar 10 09:42 anaconda-ks.cfg
-rw-r--r--. 1 root root 201 Mar 12 20:45 oldboy.txt.bak
-rw-r--r--. 1 root root 0 Mar 12 21:07 file
-rw-r--r--. 1 root root 18 Mar 13 19:32 test.txt
drwxr-xr-x 2 root root 4096 Mar 16 00:31oldboy.txt
drwxr-xr-x 2 root root 4096 Mar 16 05:30oldboy2
drwxr-xr-x. 7 root root 4096 Mar 16 2017 oldboy
-rw-r--r--. 1 root root 10 Mar 16 2017 ett.txt
[[email protected] ~]#
1.9已知apache服务的访问日志按天记录在服务器本地目录/app/logs下,由于磁盘空间紧张,现在要求只能保留最近7天的访问日志!请问如何解决? 请给出解决办法或配置或处理命令。(提示:可以从apache服务配置上着手,也可以从生成出来的日志上着手。)
解答:第一步:
首先创建运行环境:
[[email protected] logs]#mkdir -p /app/logs2
[[email protected] app]# cd logs2/
[[email protected] logs2]# ll
total 0
[[email protected] logs2]#for time in {01..16};do date -s "201703$time"; touch access_www_$(date +%F).log ;done
Wed Mar 100:00:00 CST 2017
Thu Mar 200:00:00 CST 2017
Fri Mar 300:00:00 CST 2017
Sat Mar 400:00:00 CST 2017
Sun Mar 500:00:00 CST 2017
Mon Mar 600:00:00 CST 2017
Tue Mar 700:00:00 CST 2017
Wed Mar 800:00:00 CST 2017
Thu Mar 900:00:00 CST 2017
Fri Mar 10 00:00:00 CST 2017
Sat Mar 11 00:00:00 CST 2017
Sun Mar 12 00:00:00 CST 2017
Mon Mar 13 00:00:00 CST 2017
Tue Mar 14 00:00:00 CST 2017
Wed Mar 15 00:00:00 CST 2017
Thu Mar 16 00:00:00 CST 2017
[[email protected] logs2]# date-s "20170316"
Thu Mar 16 00:00:00 CST 2017
第二步:先找到日志文件
[[email protected] logs2]# find-type f -name ‘*.log‘
./access_www_2017-03-04.log
./access_www_2017-03-02.log
./access_www_2017-03-03.log
./access_www_2017-03-01.log
./access_www_2017-03-09.log
./access_www_2017-03-07.log
./access_www_2017-03-16.log
./access_www_2017-03-10.log
./access_www_2017-03-05.log
./access_www_2017-03-15.log
./access_www_2017-03-11.log
./access_www_2017-03-08.log
./access_www_2017-03-12.log
./access_www_2017-03-13.log
./access_www_2017-03-06.log
./access_www_2017-03-14.log
第三步:使用find的参数-mtime ,查找某段时间前,然后利用管道查看出来。
[[email protected] logs2]# find-type f -name ‘*.log‘ -mtime +7 |xargs ls -l
-rw-r--r-- 1 root root 0 Mar 1 00:00 ./access_www_2017-03-01.log
-rw-r--r-- 1 root root 0 Mar 2 00:00 ./access_www_2017-03-02.log
-rw-r--r-- 1 root root 0 Mar 3 00:00 ./access_www_2017-03-03.log
-rw-r--r-- 1 root root 0 Mar 4 00:00 ./access_www_2017-03-04.log
-rw-r--r-- 1 root root 0 Mar 5 00:00 ./access_www_2017-03-05.log
-rw-r--r-- 1 root root 0 Mar 6 00:00 ./access_www_2017-03-06.log
-rw-r--r-- 1 root root 0 Mar 7 00:00 ./access_www_2017-03-07.log
-rw-r--r-- 1 root root 0 Mar 8 00:00 ./access_www_2017-03-08.log
[[email protected] logs2]#
第四步:最后一步删掉筛选的7天前的日志文件。
[[email protected] logs2]# find-type f -name ‘*.log‘ -mtime +7 |xargs rm -fr
[[email protected] logs2]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 9 00:00 access_www_2017-03-09.log
-rw-r--r-- 1 root root 0 Mar 10 00:00access_www_2017-03-10.log
-rw-r--r-- 1 root root 0 Mar 11 00:00access_www_2017-03-11.log
-rw-r--r-- 1 root root 0 Mar 12 00:00access_www_2017-03-12.log
-rw-r--r-- 1 root root 0 Mar 13 00:00access_www_2017-03-13.log
-rw-r--r-- 1 root root 0 Mar 14 00:00access_www_2017-03-14.log
-rw-r--r-- 1 root root 0 Mar 15 00:00access_www_2017-03-15.log
-rw-r--r-- 1 root root 0 Mar 16 00:00access_www_2017-03-16.log
[[email protected] logs2]#
1.10打印轻量级web服务的配置文件nginx.conf内容的行号及内容,该如何做?
解答:
1.10.1第一种方法:nl nginx.conf
[[email protected] /]# nlnginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5
[[email protected] /]#
1.10.2第二种方法:vi nginx.conf 后使用set nu来呈现行号,set nonu来取消行号
[[email protected] /]# vi nginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5
~
:set nu
1.10.3第三种方法:cat -n nginx.conf
[[email protected] /]# cat-n nginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5
[[email protected] /]#
注:
1.10.4第四种方法:awk ‘{print NR,$0}‘ nginx.conf
[[email protected] /]#awk ‘{print NR,$0}‘ nginx.conf
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5
[[email protected] /]#
注:print 表示打印,NR表示行,$0表示整行
1.10.5第五种方法
[[email protected] /]# grep-n ‘.‘ nginx.conf
1:stu1
2:stu2
3:stu3
4:stu4
5:stu5
[[email protected] /]#
注:-n表示将每一行前面加行号,‘.’表示匹配所有
1.10.6第六种方法
[[email protected] /]# sed= nginx.conf |xargs -n2
1 stu1
2 stu2
3 stu3
4 stu4
5 stu5
[[email protected] /]#
注:sed后面的等号前后有空格,否则搜不出,
1.11/etc/目录为linux系统的默认的配置文件及服务启动命令的目录
a.请用tar打包/etc整个目录(打包及压缩)
b.请用tar打包/etc整个目录(打包及压缩,但需要排除/etc/services文件)
c.请把a点命令的压缩包,解压到/tmp指定目录下(最好只用tar命令实现)
解答:
A 解答:
第一步:打包先进入要打包的目录下。
[[email protected] etc]#cd /etc/
[[email protected] etc]# tarzcf /mnt/etc.tar.gz /etc/
tar: Removing leading `/‘ from member names
tar: Removing leading `/‘ from hard link targets
[[email protected] etc]# ls /mnt/
8 data etc.tar.gz ett.txt oldboy test.txt
[[email protected] etc]#
参数解析:tar后面的参数z表示以软件gzip压缩文件,c(create)创建压缩包,f(file)指定压缩包名字。
B
解答:
第一种方法:
[[email protected] etc]#tar zcf /mnt/paichu.tar.gz /etc/ --exclude=etc/services
tar: Removing leading `/‘ from member names
tar: Removing leading `/‘ from hard link targets
[[email protected] etc]# ls /mnt/
8 data etc.tar.gz ett.txt oldboy paichu.tar.gz test.txt
[[email protected] etc]#
创建成功后,查看是否排除成功。
[[email protected] etc]# ls /mnt/
8 data etc.tar.gz ett.txt oldboy paichu.tar.gz test.txt
[[email protected] etc]#tar tf /mnt/paichu.tar.gz |grep services
etc/init/readahead-disable-services.conf
etc/etc/init/readahead-disable-services.conf
[[email protected] etc]#
查看打包的包内容,可以用tart(list)f(file) 包名字。从上面查看可以看出来查出来的文件没有/etc/services的文件。
--exclude=后面加上要排除打包的路径,最好是相对路径。
第二种方法:此方法用于排除一个或多个文件。
首先可以先将要排除的文件写入一个文件中,然后再排除。
[[email protected] etc]# vi/mnt/paichu.txt
etc/services
etc/ssh
[[email protected] etc]# tar zcf /mnt/paichu1.tar.gz /etc/--exclude-from=/mnt/paichu.txt
tar: Removing leading `/‘from member names
tar: Removing leading `/‘from hard link targets
[[email protected] etc]# ls /mnt/
8 etc.tar.gz oldboy paichu.tar.gz test.txt
data ett.txt paichu1.tar.gz paichu.txt
[[email protected] etc]# tar tf /mnt/paichu1.tar.gz |grep services
etc/init/readahead-disable-services.conf
etc/etc/init/readahead-disable-services.conf
第三种方法:利用花括号{}里面写上要排除打包的文件名。
[[email protected] etc]#tar zcf /mnt/paichu3.tar.gz /etc/ --exclude={ntp,pm}
tar: Removing leading `/‘ from member names
tar: Removing leading `/‘ from hard link targets
[[email protected] etc]# tar tf /mnt/paichu3.tar.gz |grepntp
etc/dhcp/dhclient.d/ntp.sh
etc/ntp.conf
etc/X11/fontpath.d/
etc/rc.d/rc1.d/K74ntpd
1.12已知如下命令及结果:
[[email protected] ~]$echo "I am oldboy,myqq is 31333741">>oldboy.txt
[[email protected] ~]$ catoldboy.txt
I am oldboy,myqq is31333741
现在需要从文件中过滤出“oldboy”和“31333741”字符串,请给出命令.
解答:
第一种方法:先创建测试环境
此方法是先用cut命令指定空格为分隔符,将内容分为5份,然后用sed将‘,myqq‘ 这个多余的内容取出掉。
[[email protected] data]# cat oldboy.txt
[[email protected] data]# echo "I am oldboy,myqq is31333741">>oldboy.txt
[[email protected] data]# cat oldboy.txt
I am oldboy,myqq is 31333741
[[email protected] data]#cut -d ‘ ‘ -f3,5 oldboy.txt
oldboy,myqq 31333741
[[email protected] data]# cut-d ‘ ‘ -f3,5 oldboy.txt |sed ‘s#,myqq##g‘
oldboy 31333741
[[email protected] data]#
注意:cut是截取列,
-d, --delimiter=DELIM 加上参数d表示指定分割符,后面跟上单引号分隔符,-f 表示fields表示指定列名。
第二种方法:此方法是先用sed命令将内容中唯一的逗号替换掉(只是不显示出来),然后只剩下空格,这时候再用cut 命令分割。
[[email protected] data]# cat oldboy.txt
I am oldboy,myqq is 31333741
[[email protected] data]# sed ‘s#,# #g‘ oldboy.txt
I am oldboy myqq is 31333741
[[email protected] data]# sed‘s#,# #g‘ oldboy.txt |cut -d ‘ ‘ -f3,6
oldboy 31333741
[[email protected] data]#
第三种方法:此方法是用awk先搜索出第三列和第五列,然后用sed将“.myqq”替换成空。
[[email protected] data]# cat oldboy.txt
I am oldboy,myqq is 31333741
[[email protected] data]# awk ‘{print $3,$5}‘ oldboy.txt
oldboy,myqq 31333741
[[email protected] data]# awk‘{print $3,$5}‘ oldboy.txt |sed ‘s#,myqq##g‘
oldboy 31333741
[[email protected] data]#
awk 默认分隔符是空格,如果想指定某个分割符,可以加上F,后面加上指定的分隔符。
第四种方法:利用awk的F参数指定分隔符
[[email protected] data]# awk -F ‘[ ,]‘ -f3,6 oldboy.txt
awk: fatal: can‘t open source file `3,6‘ forreading (No such file or directory)
[[email protected] data]# awk-F ‘[ ,]‘ ‘{print $3,$6}‘ oldboy.txt
oldboy 31333741
[[email protected] data]#
第五种方法:使用cut的参数c来去字符,空格与逗号都算一个字符。取得列前面不用加f
[[email protected] data]# cut -c 6-11,20- oldboy.txt
oldboy 31333741
[[email protected] data]#
第六种方法:此种方法是用先将这两句话换行成两行,然后取最后一行。
[[email protected] data]# awk-F ‘[,]‘ ‘{print $1"\n"$2}‘ oldboy.txt 此处的F后面的‘[,]‘ 可以用,代替。
I am oldboy
myqq is 31333741
[[email protected] data]# awk-F, ‘{print $1"\n"$2}‘ oldboy.txt |awk ‘{print $NF}‘
oldboy
31333741
[[email protected] data]#
第七种方法:利用tr命令,它是精简版的sed。
[[email protected] data]# tr ‘,‘ "\n" <oldboy.txt
I am oldboy
myqq is 31333741
[[email protected] data]# tr ‘,‘ "\n" <oldboy.txt |awk ‘{printNF}‘
3
3
[[email protected] data]# tr ‘,‘ "\n" <oldboy.txt |awk ‘{print$NF}‘
oldboy
31333741
[[email protected] data]#
注:tr 后面的‘,’表示指定逗号为分隔符,后面的“\n”表示搜索到以后从分隔符后换行。
1.13过滤出/etc/services 文件包含3306或1521两数据库端口的行的内容。
##使用grep过滤
[[email protected] etc]# grep -E ‘1521|3306‘ services |在引号中是或者的意思,不加单引号就是管道
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
[[email protected] etc]#
##使用AWK过滤
[[email protected] tmp]# awk ‘/1521|3306/‘ /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCubeLicense Manager
##使用sed过滤
[[email protected] tmp]# sed -nr ‘/1521|3306/‘ /etc/services
sed: -e expression #1, char 11: missing command
[[email protected] tmp]# sed -nr ‘/1521|3306/p‘ /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
ncube-lm 1521/tcp # nCube License Manager
ncube-lm 1521/udp # nCube License Manager
[[email protected] tmp]#