关于 文件系统 用户管理的基础练习题
练习题:(使用自己现有知识做的,答案仅供参考)
练习1、定义别名命令baketc,每天将/etc/目录下所有文件,备份到/testdir独立的子目录下,并要求子目录格式为backupYYYY-mm-dd,备份过程可见?
解 :在家目录中.bashrc中定义别名:
alias baketc=' cp -rpv /etc/ /testdir/backup$(date +%F)'
cp -r: 拷贝目录;-p:保留权限;-v:显示其过程 $(date +%F):命令引用当前时间
由于我们还没有学习定时任务,所以可以每天手工的运行以上的别名可以实现数据备份。
练习2、创建/testdir/rootdir目录并复制/root所有下文件到该目录内,要求保留原有权限?
解:mkdir -p /testdir/rootdir #:创建目录中的目录需要带参数 -p
cp -rp /root/ /testdir/rootdir #: cp -r: 拷贝目录;-p:保留权限
练习3、如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b ?
解:mkdir -vp /testdir/dir1/{x,y}/{a,b}
Dir1
├── x
│ ├── a
│ └── b
└── y
├── a
└── b
[root@wCentos7 testdir]# mkdir -vp /testdir/dir1/{x,y}/{a,b}
mkdir: created directory ‘/testdir/dir1’
mkdir: created directory ‘/testdir/di1/x’
mkdir: created directory ‘/testdir/dir1/x/a’
mkdir: created directory ‘/testdir/dir1/x/b’
mkdir: created directory ‘/testdir/dir1/y’
mkdir: created directory ‘/testdir/dir1/y/a’
mkdir: created directory ‘/testdir/dir1/y/b’
练习4、如何创建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b
解:mkdir -vp /testdir/dir2/{x/{a,b},y}
需要得到的目录树为:
dir2
├── x
│ ├── a
│ └── b
└── y
[root@wCentos7 testdir]# mkdir -vp /testdir/dir2/{x/{a,b},y}
mkdir: created directory ‘/testdir/dir2’
mkdir: created directory ‘/testdir/dir2/x’
mkdir: created directory ‘/testdir/dir2/x/a’
mkdir: created directory ‘/testdir/dir2/x/b’
mkdir: created directory ‘/testdir/dir2/y’
练习5、如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7?
解:mkdir -vp /testdir/{dir3,dir4,dir5/{dir6,dir7}}
需要得到的目录树结构为:
├── dir3
├── dir4
├── dir5
│ ├── dir6
│ └── dir7
[root@wCentos7 testdir]# mkdir -pv /testdir/{dir3,dir4,dir5/{dir6,dir7}}
mkdir: created directory ‘/testdir/dir3’
mkdir: created directory ‘/testdir/dir4’
mkdir: created directory ‘/testdir/dir5’
mkdir: created directory ‘/testdir/dir5/dir6’
mkdir: created directory ‘/testdir/dir5/dir7’
练习6、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中?
cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out
解:管道的作用就是把上个命令的输出,当做下一个命令的输入。
Cat 看的到文件内容输出给 tr ,
tr 'a-z' 'A-Z'
tr把输入的内容所有小写“a-z”转换为 大写的“A-Z”
[root@wCentos7 testdir]# cat /etc/issue | tr 'a-z' 'A-Z' >/tmp/issue.out
[root@wCentos7 testdir]# cat /tmp/issue.out
\S
KERNEL \R ON AN \M
========================
WELCOME TO MY HOSTNAME SA
WELCOME TO MY HOSTNAME SB
=========================
[root@wCentos7 testdir]# cat /etc/issue
\S
Kernel \r on an \m
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
练习7、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中?
解:who | tr 'a-z' 'A-Z' >/tmp/who.out
Who :查看当前系统登录用户 who 命令;
转换大写: tr 'a-z' 'A-Z'
> :输出从定向到 /tmp/who.out文件
[root@wCentos7 testdir]# who | tr 'a-z' 'A-Z' >/tmp/who.out
[root@wCentos7 testdir]# who
root :0 2016-07-28 08:36 (:0)
root pts/0 2016-07-30 08:41 (10.1.16.1)
[root@wCentos7 testdir]# cat /tmp/who.out
ROOT :0 2016-07-28 08:36 (:0)
ROOT PTS/0 2016-07-30 08:41 (10.1.16.1)
练习8、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:
Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks!
操作系统版本信息
?
解:重点在于如何实现邮件调用系统的命令:
用户名 : id -un
操作系统版本信息 : cat /etc/redhat-release
mail -s "hello" root <root.mail
nano root.mail
Hello, I am `id -un`,the system version is here,pleasehelp me to check it ,thanks!
`cat /etc/redhat-release`
练习9、将/root/下文件列表,显示成一行,并文件名之间用空格隔开?
解:ls -1 /root | tr "\n" " "
重点:
ls 先让文件列表一列显示;
替换掉每行的换行符 ”\n“为 空格即可 实现我们的要求
[root@wCentos7 ~]# ls -1 /root
anaconda-ks.cfg
bash1.sh
bash.sh
Desktop
Documents
Downloads
dz
dz.zip
f11
f1.txt
initial-setup-ks.cfg
linux.txt
Music
Pictures
Public
Templates
Videos
windows_tr.txt
windows.txt
zzzzzzz
[root@wCentos7 ~]# ls -1 /root | tr "\n" " "
anaconda-ks.cfg bash1.sh bash.sh Desktop Documents Downloads dz dz.zip f11 f1.txt initial-setup-ks.cfg linux.txt Music Pictures Public Templates Videos windows_tr.txt windows.txt zzzzzzz
[root@wCentos7 ~]#
练习10、file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和?
解:由于内容确定了,文件的格式确定了,我们可以分析:
把文件内容中每个数字之间的空格换成”+“号,再让我们的计算器程序 bc 区统计和即可
[root@wCentos7 ~]# cat file1_sum
1 2 3 4 5 6 7 8 9 10
[root@wCentos7 ~]# echo " $(cat file1_sum | tr " " "+") "| bc
55
练习11、删除Windows文本文件中的'^M'字符
解:我们得先确定,相同的内容的文件,在windows和linux中有上面区别,
Windows.txt 与 linux.txt
[root@wCentos7 ~]# cat windows.txt #windows传到linux文件
hello!
what is your name ?
my name is sb
how are you ?
bey-bey!
[root@wCentos7 ~]# cat linux.txt #linux上相同内容的文件
hello!
what is your name ?
my name is sb
how are you ?
bey-bey!
[root@wCentos7 ~]# ll windows.txt linux.txt #相同内容的文件大小不一样
-rw-r–r–. 1 root root 70 Jul 30 10:13 linux.txt
-rwxr–r–. 1 root root 80 Jul 30 10:11 windows.txt
[root@wCentos7 ~]# hexdump -c windows.txt #查看16进制的windows文件
0000000 h e l l o ! \r \n w h a t i s
0000010 y o u r n a m e ? \r \n m y
0000020 n a m e i s s b \r \n \r \n \r
0000030 \n h o w a r e y o u ? \r \n
0000040 \r \n \r \n \r \n b e y – b e y ! \r \n
0000050
[root@wCentos7 ~]# hexdump -c linux.txt #查看16进制的linux文件
0000000 h e l l o ! \n w h a t i s y
0000010 o u r n a m e ? \n m y n a
0000020 m e i s s b \n \n \n h o w a
0000030 r e y o u ? \n \n \n \n b e y –
0000040 b e y ! \n \n
0000046
[root@wCentos7 ~]# cat windows.txt | tr -d "\r">windows_tr.txt
通过观察发现:windows的文件多出了 \r的字符,所以删除掉 \r字符即可,删除后文件的内容还是有一点不一样,就是\n的数量问题,linux的\n数量比windows的要多些,现在我们处理不了,了解windows和linux文本文件的有什么区别即可。
[root@wCentos7 ~]# ll
total 36
-rw——-. 1 root root 1417 Jul 21 11:34 anaconda-ks.cfg
-rw-r–r–. 1 chen ChenJiaShun 0 Jul 28 16:33 bash1.sh
-rw-r–r–. 1 root root 0 Jul 28 16:33 bash.sh
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Desktop
drwxr-xr-x. 3 root root 17 Jul 27 23:14 Documents
drwxr-xr-x. 2 root root 22 Jul 28 11:39 Downloads
-rw-r–r–. 1 root root 52 Jan 12 2016 dz
-rwxrw-rw-. 1 root root 154 Jul 29 18:13 dz.zip
-rw-r–r–. 1 root root 12 Jul 27 10:19 f11
-rwxrw-rw-. 1 root root 15 Jul 27 10:15 f1.txt
-rw——-. 1 root root 1465 Jul 21 11:35 initial-setup-ks.cfg
-rw-r–r–. 1 root root 70 Jul 30 10:13 linux.txt
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Music
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Pictures
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Public
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Templates
drwxr-xr-x. 2 root root 6 Jul 21 11:54 Videos
-rw-r–r–. 1 root root 70 Jul 30 10:17 windows_tr.txt
-rwxr–r–. 1 root root 80 Jul 30 10:11 windows.txt
-rw-r–r–. 1 root root 0 Jul 27 23:24 zzzzzzz
[root@wCentos7 ~]# hexdump -c linux.txt
0000000 h e l l o ! \n w h a t i s y
0000010 o u r n a m e ? \n m y n a
0000020 m e i s s b \n \n \n h o w a
0000030 r e y o u ? \n \n \n \n b e y –
0000040 b e y ! \n \n
0000046
[root@wCentos7 ~]# hexdump windows_tr.txt
0000000 6568 6c6c 216f 770a 6168 2074 7369 7920
0000010 756f 2072 616e 656d 3f20 6d0a 2079 616e
0000020 656d 6920 2073 7320 0a62 0a0a 6f68 2077
0000030 7261 2065 6f79 2075 0a3f 0a0a 620a 7965
0000040 622d 7965 0a21
0000046
[root@wCentos7 ~]# hexdump -c windows_tr.txt
0000000 h e l l o ! \n w h a t i s y
0000010 o u r n a m e ? \n m y n a
0000020 m e i s s b \n \n \n h o w
0000030 a r e y o u ? \n \n \n \n b e y
0000040 – b e y ! \n
0000046
练习12、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格
解:分析下字符串中相当与要删除字母,删除标点符号等字符;
我们用tr -d 删除字母 r -d "[[:alpha:]]" ;
我们用tr -d 删除标点符号 r -d "[[:punct:]]" ;
echo "xt.,l 1 jr#!$mn2 c*/fe3 uz4" | tr -d "[[:alpha:]]" | tr -d "[[:punct:]]"
[root@wCentos7 testdir]# echo "xt.,l 1 jr#"[[:alpha:]]"mn2 c*/fe3 uz4 5 6 7 8" | tr -d "[[:alpha:]]" | tr -d "[[:punct:]]"
1 2 3 4 5 6 7 8
[root@wCentos7 testdir]#
练习13、将PATH变量每个目录显示在独立的一行
echo $PATH | tr ':' '\n'
解:分析下 $PATH是以 : 为分隔符,所以把 : 替换成换行 \n即可
[root@wCentos7 testdir]# echo $PATH | tr ':' '\n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
[root@wCentos7 testdir]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
练习14、删除指定文件的空行
例如: file1
解 :cat /etc/issue | tr -s "\n" \S
#原文件中 换行为 \n 两个重复的\n删除一个保留一个 即可以实现删除空行的效果
[root@wCentos7 testdir]# cat /etc/issue | tr -s "\n" \S
Kernel \r on an \m
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
[root@wCentos7 testdir]# cat /etc/issue
\S
Kernel \r on an \m
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
练习15、将文件中每个单词(字母)显示在独立的一行,并无空行
解:cat /etc/issue |tr "[[:space:]]" "\n" | tr -s "\n"
分析下文件内容:
需要每个字母的尾部空白行 替换为换行符 \n,tr "[[:space:]]" "\n"
再删除掉有重复换行符的即可:tr -s "\n"
[root@wCentos7 testdir]# cat /etc/issue
\S
Kernel \r on an \m
========================
welcome to my hostname SA
welcome to my hostname SB
=========================
[root@wCentos7 testdir]# cat /etc/issue |tr "[[:space:]]" "\n" | tr -s "\n"
\S
Kernel
\r
on
an
\m
========================
welcome
to
my
hostname
SA
welcome
to
my
hostname
SB
=========================
练习16、创建用户gentoo,附加组为bin和root,默认shell为/bin/csh,注释信息为"Gentoo Distribution"
解: useradd -G bin,root -s /bin/csh -c "Gentoo Distribution" gentoo
Useradd :添加用户的命令;
-G :设置用户的附加组
-s: 设置用户的shell环境
-c: 设置用户的描述 说明
[root@wCentos7 ~]# getent passwd gentoo #查看用户的说明
gentoo:x:1002:1002:Gentoo Distribution:/home/gentoo:/bin/csh
[root@wCentos7 ~]# getent group gentoo
gentoo:x:1002:
[root@wCentos7 ~]# cat /etc/group #查看附加组中是否有gentoo用户信息
root:x:0:gentoo
bin:x:1:gentoo
…………..
gentoo:x:1002:
[root@wCentos7 ~]#
练习17、创建下面的用户、组和组成员关系
名字为admins 的组
用户natasha,使用admins 作为附属组
用户harry,也使用admins 作为附属组
用户sarah,不可交互登录系统,且不是admins 的成员,natasha,harry,sarah密码都是centos
解:groupadd admins
#单独添加群组的命令
useradd -G admins natasha
#添加用户 natasha 并且设置附加组为 admins
useradd -G admins harry
#添加用户 harry并且设置附加组为 admins
useradd -s /sbin/nologin sarah
#添加用户 sarah 不让其登录设置shell为:/sbin/nologin即可
echo centos | passwd –stdin natasha
#passwd –stdin接收标准输入的密码 centos ,这样可以避免用户交互
echo centos | passwd –stdin harry
#passwd –stdin接收标准输入的密码 centos ,这样可以避免用户交互
echo centos | passwd –stdin sarah
#passwd –stdin接收标准输入的密码 centos ,这样可以避免用户交互
[root@wCentos7 ~]# groupadd admins
[root@wCentos7 ~]# useradd -G admins natasha
[root@wCentos7 ~]# useradd -G admins harry
[root@wCentos7 ~]# useradd -s /sbin/nologin sarah
[root@wCentos7 ~]# echo ecntos | passwd –stdin natasha
Changing password for user natasha.
passwd: all authentication tokens updated successfully.
[root@wCentos7 ~]# echo ecntos | passwd –stdin harry
Changing password for user harry.
passwd: all authentication tokens updated successfully.
[root@wCentos7 ~]# echo ecntos | passwd –stdin sarah
Changing password for user sarah.
passwd: all authentication tokens updated successfully.
[root@wCentos7 ~]#
[root@wCentos7 ~]# getent group admins
admins:x:1003:natasha,harry
[root@wCentos7 ~]# getent passwd sarah
sarah:x:1005:1006::/home/sarah:/sbin/nologin
[root@wCentos7 ~]# getent passwd natasha
natasha:x:1003:1004::/home/natasha:/bin/bash
[root@wCentos7 ~]# getent passwd harry
harry:x:1004:1005::/home/harry:/bin/bash
[root@wCentos7 ~]# w
10:56:53 up 23:15, 5 users, load average: 0.02, 0.04, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 Thu08 ?xdm? 19:20 0.44s gdm-session-worker [pam/gdm-autologin]
root pts/1 10.1.16.1 10:52 4:21 0.03s 0.03s -bash
root pts/0 10.1.16.1 08:41 5.00s 2.77s 0.03s w
natasha tty2 10:53 3:25 0.02s 0.02s -bash
harry tty3 10:56 21.00s 0.02s 0.02s -bash
原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/27699