Java后端?面试官真问了Linux命令!

    科技2024-10-08  18

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

    “知道个大概,会用”

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

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

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

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

    “查找指定字符呢?”

    “...”

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

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

    文件系统相关命令

    1. df

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

    [nginx@localhost ~]$ df -hFilesystem               Size  Used Avail Use% Mounted ondevtmpfs                 1.9G     0  1.9G   0% /devtmpfs                    1.9G     0  1.9G   0% /dev/shmtmpfs                    1.9G   12M  1.9G   1% /runtmpfs                    1.9G     0  1.9G   0% /sys/fs/cgroup/dev/mapper/centos-root   17G  1.9G   16G  12% //dev/sda1               1014M  150M  865M  15% /boottmpfs                    378M     0  378M   0% /run/user/1000

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

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

    [nginx@localhost ~]$ dfFilesystem              1K-blocks    Used Available Use% Mounted ondevtmpfs                  1918620       0   1918620   0% /devtmpfs                     1930648       0   1930648   0% /dev/shmtmpfs                     1930648   11884   1918764   1% /runtmpfs                     1930648       0   1930648   0% /sys/fs/cgroup/dev/mapper/centos-root  17811456 1963760  15847696  12% //dev/sda1                 1038336  153516    884820  15% /boottmpfs                      386132       0    386132   0% /run/user/1000

    2. du

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

    [root@localhost opt]# du -h redis638M redis6/bin38M 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

    这种事只能删文件,山目录得加上-r:rm -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

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

    11. touch

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

    touch & stat

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

    touch创建文件

    文本操作相关命令

    1. more

    more:cat命令一下子把内容全部展示出来,当需要看前面的内容的时候还需要鼠标向上滑,这时候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 保存退出 同wqShift+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 删除第3到5行:$-1d 删除倒数第2行

    grep 正则表达式

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

    grep, egrep, fgrep - print lines matching a pattern

    简单使用

    文件txt内容如下:

    [root@localhost test]# cat txthello worldhello javajava is the bestphp is the bestthinking in javajava learninghello buddywj1239jkl12ni haoheihei

    查找所有包含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 wcwc - print newline, word, and byte counts for each file

    行编辑器-sed

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

    man sed看一下使用介绍:

    NAME       sed - stream editor for filtering and transforming textSYNOPSIS       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' fileoptions:-n 静默模式,不再默认显示模式空间(就是内存)中的内容-i 直接修改源文件-e script -e script ... 可以同时执行多个脚本-r 表示使用扩展正则表达式command:d 删除符合条件的行p 显示符合条件的行a \str 在指定的行后面追加新行,内容为str\n 换行i \str 在指定的行前面添加新行,内容为strc 取代,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.dmv CentOS-Base.repo CentOS-Base.repo.bakwget -O CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum clean allyum makecache

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

    配置本地yum源

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

    repo本地目录源:mount /dev/cdrom /mnt修改配置文件 /etc/yum.repos.d/CentOS-Base.repobaseurl=file:///mntgpgcheck=1enable=1然后执行:yum clean allyum makecacheyum repolist

    先总结到这里吧。

    欢迎关注公众号行百里er,回复linux即可获取本文pdf文档。

    Processed: 0.009, SQL: 8