Java后端?面试官真问了Linux命令!| 掘金技术征文-双节特别篇

326 阅读11分钟

有一次面试,我被问到:“你知道vi编辑器吗?”

“知道个大概,会用”

“怎么定位到文件末尾?”

“额,这个没用过,我都是直接按向下箭头到末尾的”

“那么怎么删除一整行呢?”

“是按两次D吧?这个记不清了...”

“查找指定字符呢?”

“...”

此时,我心想,我一个Java后端,又不是运维,问我这个干嘛?

当然,我还是有一定的反思的,毕竟我也经常和Linux打交道。经过总结,形成此文,以供查阅,也是和大家分享一下。

文件系统相关命令

1. df

df命令可以显示磁盘分区使用情况

[nginx@localhost ~]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 1.9G     0  1.9G   0% /dev
tmpfs                    1.9G     0  1.9G   0% /dev/shm
tmpfs                    1.9G   12M  1.9G   1% /run
tmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/mapper/centos-root   17G  1.9G   16G  12% /
/dev/sda1               1014M  150M  865M  15% /boot
tmpfs                    378M     0  378M   0% /run/user/1000

不仅能看到每个分区的使用情况,还能看到分区被挂载到哪个地方了。

其中 -h是为了显示人类认识的文件大小的,不加-h是这样的:

[nginx@localhost ~]$ df
Filesystem              1K-blocks    Used Available Use% Mounted on
devtmpfs                  1918620       0   1918620   0% /dev
tmpfs                     1930648       0   1930648   0% /dev/shm
tmpfs                     1930648   11884   1918764   1% /run
tmpfs                     1930648       0   1930648   0% /sys/fs/cgroup
/dev/mapper/centos-root  17811456 1963760  15847696  12% /
/dev/sda1                 1038336  153516    884820  15% /boot
tmpfs                      386132       0    386132   0% /run/user/1000

2. du

du命令用来显示文件系统使用情况。

[root@localhost opt]# du -h redis6
38M	redis6/bin
38M	redis6

可以看到 redis6 这个文件夹下每个文件夹的大小。

一般我们会先df看一下哪个分区占用大,然后在进去用du看具体的文件夹使用情况。

3. ls

列出当前目录下的文件(夹)列表。

蓝色的是文件夹,红色的是文件。

ls -l列出当前目录下的文件列表,ll是其简写形式:

(注:都可以在需要的时候接上-h

4. cd

切换当前目录,这个比较简单:

可以用pwd查看当前工作目录。

可以直接cd或者cd ~进入家目录:

返回上一级目录用cd ..

5. cp

cp就是copy,拷贝。

拷贝/etc/profile文件到当前目录:

cp -r可以拷贝文件夹及其下面的所有子文件夹和文件。

6. mv

  • 移动文件

把test/profile文件移动到boy文件夹下:mv profile boy/

mv 移动

  • 重命名

把laopo重命名为gf:mv laopo gf

mv 重命名

7. mkdir

创建目录的命令。

mkdir

创建多级目录

mkdir -p test/laogong/adir

mkdir -p

-p是为了自动创建中间的不存在的目录,比如本例的laogong文件夹。

批量创建mkdir test/laogong test/laopo test/girl

一次创建多个目录

这样有点繁琐,还可以这样:mkdir test/{a,b,c}dir

一次创建多个目录简写

8. rm

删除文件的命令。

rm

这种方式需要输入yes确认后才能删除,如果不想输入yes,可以使用:rm -f

rm -f

这种事只能删文件,山目录得加上-rrm -r -f gf或者rm -rf gf

rm -rf

9. ln

ln建立链接命令。

ln 硬链接

这两个建立了硬链接的文件是一模一样的,此时若修改profile文件,则aaa文件也跟着变:

硬链接文件关系

也就是说aaa和profile在底层操作的是同一个文件。

有硬必有软,那么有硬链接那肯定也有软连接,ln -s命令建立软链接:

ln -s

可以看到bbb文件是一个链接文件,并且可以查看其内容:

此时删除profile文件,看看:

说明bbb这个软链接文件已经不存在了,但是刚才的aaa还在。这也说明了,硬链接的两个文件底层指向了同一个文件,删除其中一个,对另一个不影响;而软链接则是bbb指向profile,profile指向底层的某个文件,当把profile删掉后,bbb的指向就被删除了,因此bbb文件也就不存在了。

硬链接

软链接

10. stat

stat查看文件的详细信息,和ll不同,他能看到更为详细的信息:

stat

这里需要注意一下ModifyChange时间,当修改了文件的元数据时(一个文件的创建时间、权限、位置等都属于文件的元数据),change时间会改变,比如文件的权限、位置等;而当修改文件的内容,才会改变modify的时间。

11. touch

touch就是摸一下,摸一下某个文件,和上面的stat结合起来看一下:

touch & stat

另外,touch还能创建一个文件:

touch创建文件

文本操作相关命令

1. more

morecat命令一下子把内容全部展示出来,当需要看前面的内容的时候还需要鼠标向上滑,这时候more就派出用场了:

看下一屏直接按空格一行一行的看按回车

2. less

比more更牛逼的是less命令,它不仅能一屏一屏(按空格键)的往前看,还能往后翻页回看(按b键):

less /etc/profile

空格键看下一屏幕的内容,按b看上一屏幕的内容。

less 命令是把文件内容读出来放到内存中,所以它能来回翻页看。但是如果文件太大比如10G,而内存只有4G,这个时候就不能用 less 命令了,只能用 more 命令。

3. head

head命令用于查看文件前多少行的数据,默认展示前10行。

head

还可以指定看前多少行,比如看profile文件的前5行:

head -5 profile

head -5

4. tail

与head相反的是tail,他可以看文件的后多少行。

# 后5行
tail -5 profile

平常我用的更多的是tail -f命令,这个-f参数表示输出这个文件的增量数据,下面举个例子,先touch testfile创建一个文件,再tail -f testfile监控它:

tail -f

再开一个连接,向testfile文件添加内容:

[root@localhost test]# echo "你好6啊!" >> testfile 

tail -f

回到tail -f testfile那个窗口:

tail -f

tail -f 就是监控文件内容用的。

5. 管道

管道在文本操作命令中是经常被使用到的,用一个竖杠|表示管道。

比如:

[root@localhost test]# cat profile | head -3

这个命令的左边cat profile命令会以输出流的形式交给管道|后面的命令head -3,后面这个命令会以输入流的形式接收。

注意,有些命令是无法接收管道左边的命令的,比如ls -l,也就是说echo "/" | ls -l是无法列出根目录下的内容的(它实际上列出的是当前目录文件列表),可以借助于xargs命令

xargs - build and execute command lines from standard input

可用echo "/" | xargs ls -l替换echo "/" | ls -l来达到目的。

管道还有其他的妙用,比如我想看某个文件的第6行,可以head -6输出前6行,通过管道给tail -1,这样就可以打印出第6行的数据:

6. vi 文本编辑器

  • 编辑模式

vi profile 打开profile文件进入编辑模式,默认光标位于文件首行,vi +10 profile打开文件光标默认位于第10行的位置,以此类推。

要直接定位到最后一行的行首,使用vi + profile

vi 编辑模式移动光标的一些快捷键(面试被问到过):

单词
w 移动到下一个单词的词首
b 跳到当前或上一个单词的词首
e 跳到当前或下一个单词的词尾

字符
h 向左移动
j 向下移动
k 向上移动
l 向右移动

行内
0 绝对行首
^ 行首的第一个非空白字符
$ 绝对行尾

行间
G 文章末尾
6G 第6行
gg 文章开头

翻屏
Ctrl+f 往后翻
Ctrl+b 往前翻

vi 编辑模式删除/替换字符快捷键:

x 删除光标位置字符
3x 删除光标开始3个字符
r 替换光标位置字符

dd 删除一行
dw 删除一个单词
yw 复制光标后面的单词
yy 复制光标所在行
p(小写) 粘贴复制的内容到光标所在下一行
P(大写) 粘贴复制的内容到光标所在上一行
u 撤销
Ctrl+r 恢复
. 重复上一个操作
  • 输入模式

编辑模式下,无法对文件进行输入内容,需要切换到输入模式,按下i键即可切换到输入模式。

i是常用的切换到输入模式的快捷键。还有其他键可以切换到输入模式:

i 在当前光标所在字符的前面

a 在当前光标所在字符的后面

o 在当前光标所在行的下一行

O 在当前光标所在行的上一行

A 在当前光标行的行尾

按一下Esc键可从输入模式切换到编辑模式。

  • 末行模式

在编辑模式下,按:即可进入末行模式,在末行模式下文件的保存和退出有如下命令:

w 保存
q 直接退出 没有动过文件
wq 保存并退出 动过文件了,不后悔
q! 不保存并退出 动过文件了,后悔了
w! 强行保存
x 保存退出 同wq
Shift+zz 保存并退出 同wq

末行模式下还有一些非常实用的命令。

设置行号

set number 显示行号
set nu 显示行号(简写)
set nonumber 隐藏行号
set nonu 隐藏行号(简写)
[root@localhost test]# vi +10 profile

设置显示行号

设置只读模式:set readonly:

设置只读

再进入输入模式就会出现警告:

末行模式下的查找

方式一:
:/要查找的字符 
先按回车键,然后按n键往下查找,按N往上查找

方式二:
:?要查找的字符
先按回车键,然后按n是往上查找,按N是往下查找(和:/查找相反)

末行模式下执行命令

这个也很有用,比如设置某个环境变量,当要输入路径时忘了路径在哪了,此时我们不必退出编辑模式,而是直接在末行模式下输入ls -l等命令来查找大概位置。

:!执行命令

命令输入完了,按回车:

再按回车就可重新回到编辑模式。

查找并替换

:s/str1/str2 替换光标所在行第一个匹配到的字符串
:s/str1/str2/g 替换光标所在行的所有匹配到的字符
:s/str1/str2/gi 替换光标所在行的所有匹配到的字符忽略大小写
:.,+3s/str1/str2/gi 光标当前行往下3行全部替换忽略大小写
:%s/str1/str2/gi 全文替换
:0,$s/str1/str2/gi 全文替换

末行模式下其他命令

:3,5d 删除第35:$-1d 删除倒数第2

grep 正则表达式

Linux中使用grep命令来使用正则表达式匹配字符。

grep, egrep, fgrep - print lines matching a pattern

简单使用

文件txt内容如下:

[root@localhost test]# cat txt
hello world
hello java
java is the best
php is the best
thinking in java
java learning
hello buddy
wj1239jkl
12ni hao
heihei

查找所有包含java的行:

grep "java" txt

查找包含数字的行:

grep "[0-9]" txt

其他文本处理命令-cut sort wc

1. cut

显示切割的行数据

cut - remove sections from each line of files

-f 选择显示的列
-s 不显示没有分隔符的行
-d 自定义分隔符

比如,打印出每行第一列数据:

cut -d ' ' -f1 txt

显示切割后的第1,2列:

cut -d ' ' -f1,2 txt

再比如passwd文件:

cut命令打印出所有用户名:

cut -d ":" -f1 passwd

2. sort

排序

n 按数值排序
r 倒序
t 自定义分隔符
k 选择排序列
u 合并相同行
f 忽略大小写
sort -t ' ' -k1 -u -f txt

3. wc

wordcount的缩写,顾名思义,就是单词数量的统计。

man wc

wc - print newline, word, and byte counts for each file

行编辑器-sed

sed 以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作。

man sed看一下使用介绍:

NAME
       sed - stream editor for filtering and transforming text

SYNOPSIS
       sed [OPTION]... {script-only-if-no-other-script} [input-file]...

DESCRIPTION
       Sed  is  a  stream  editor.  A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).  While in some
       ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently  more  efficient.
       But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
用法:
sed [options] 'command' file

options:
-n 静默模式,不再默认显示模式空间(就是内存)中的内容
-i 直接修改源文件
-e script -e script ... 可以同时执行多个脚本
-r 表示使用扩展正则表达式

command:
d 删除符合条件的行
p 显示符合条件的行
a \str 在指定的行后面追加新行,内容为str
\n 换行
i \str 在指定的行前面添加新行,内容为str
c 取代,c的后面可以接字符串
s/pattern/str/修饰符 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
    g 行内全局替换
    i 忽略字符大小写

用户与权限

groupadd 添加用户组
groupdel 删除用户组
useradd 添加用户
userdel 删除用户
usermod 把某个用户迁移到某个组中
id 显示用户信息
passwd 修改(设置)用户密码
sudo 可以使用root权限(需要设置)
su 切换用户
chmod 修改文件的权限 权限表示方式:字母、数字
    属主 数组 其他人
    rwx  rwx  rwx
    111  111  111(二进制)
    7    7    7(十进制)
chown 修改文件的属主与主组

其他人:

chmod o+rwx 文件名

自己:

chmod u+rwx 文件名

软件安装与卸载

1. rpm

Redhat提供了rpm管理体系。

已经编译的软件包:针对不同的平台系统编译目标软件包

软件包包含依赖检查,但,还需人为解决

  • 安装
rpm -ivh filename i是安装,v显示进度

--prefix path 装到path路径下
  • 卸载
rpm -e PACKAGE_NAME 卸载
  • 其它选项
rpm -qa  查询已经安装的所有包
rpm -q  PACKAGE_NAME 查询指定的包是否已经安装
rpm -qi PACKAGE_NAME 查询指定包的说明信息
rpm -ql PACKAGE_NAME 查询指定包安装后生成的文件列表
rpm -qc PACEAGE_NEME查询指定包安装的配置文件
rpm -qd PACKAGE_NAME 查询指定包安装的帮助文件
rpm -q --scripts PACKAGE_NAME 查询指定包中包含的脚本 
rpm -qf /path/to/somefile 查询文件是由哪个rpm包安装生成的

2. yum

Linux的软件管家。

yum默认的是国外源,可以配置国内软件源。

配置国内yum源

  • 修改配置文件
  • yum clean all 清空本地的依赖缓存
  • yum makecache 将依赖缓存下载到本地
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.bak
wget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache

然后可以直接使用yum install来安装软件了。

配置本地yum源

当主机没法上网时,该如何使用yum安装软件呢?可以配置本地的yum源。

repo本地目录源:
mount /dev/cdrom /mnt

修改配置文件 /etc/yum.repos.d/CentOS-Base.repo
baseurl=file:///mnt
gpgcheck=1
enable=1

然后执行:
yum clean all
yum makecache
yum repolist

您的点赞,我的动力!

关注公众号 行百里er,回复linux获取本文pdf文件。

🏆 掘金技术征文|双节特别篇