肝了几个周末,万字长文吐血总结Linux命令以及面试实例分享!如果觉得文章还不错的,欢迎点赞关注哦!
1、基础命令
ls
- 默认列出当前目录,也可以列出指定目录下的文件列表。
ll
pwd
touch
- 将每个文件的访问和修改时间更新为当前时间。除非提供
-c 或-h ,否则将不存在的FILE 参数创建为空。
$ touch test1 test2 test3
$ touch -c test5
$ ls
test1 test2 test3
cat
$ cat test
-A, --show-all 等价于 -vET
-b, --number-nonblank 对非空输出行编号
$ cat -n test
1 -A, --show-all 等价于 -vET
2 -b, --number-nonblank 对非空输出行编号
$ cat -n log2012.log log2013.log
$ cat -b log2012.log log2013.log log.log
tac
- tac命令与cat命令展示内容相反,不能带行号输出。
$ tac test
-b, --number-nonblank
-A, --show-all
chmod
- Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用
chmod 可以控制文件如何被他人所调用。
chmod abc file
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=5。
比如:
chmod 777 file
chmod 700 file
mkdir
$ mkdir t
$ mkdir -p /tmp/test/t1/t
cd
$cd /
rm & rmdir
-i, —interactive 进行交互式删除-r, -R, —recursive 指示rm 将参数中列出的全部目录和子目录均递归地删除。-d, --dir 删除空目录
$ rm -rf linux
$ rmdir == rm -d 删除空目录
mv
- 移动目录或者文件到指定目录下,同时具有重命名的功能。
$ mv test.log test1.txt
$ mv log1.txt,log2.txt,log3.txt /test3
cp
- 将源文件复制至目标文件,或将多个源文件复制至目标目录。
-i 提示-r 复制目录及目录内所有项目-a 复制的文件与原文件时间一样
$ cp -ai a.txt test
echo
$ echo "change world"
change world
$ echo $PWD
/Users/localhost/test
2、文件操作类
head
- head 用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。
-n 展示前n行-c 展示前n个字符
$ head -n15 test.txt
$ head -c23 test.txt
tail
- 从尾部开始展示文本,常用查看日志文件。
-f 循环读取(常用于查看递增的日志文件)-n <行数> 显示行数(从后向前)
日志文件没办法用vim或者cat这样去看,一般常用tail、grep或者more
more
- 功能类似于
cat, more 会以一页一页的显示方便使用者逐页阅读, - 最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示。
cat命令是全部读取输出到标准输出,如果文件太大会把屏幕刷满的,根本没办法看。
$ more +3 text.txt
$ ls -l | more -5
less
less 与 more 类似,但使用less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件
$ ps -a | less -N
wc
wc(word count) 功能为统计指定的文件中字节数、字数、行数,并将统计结果输出-c 统计字节数-l 统计行数-m 统计字符数-w 统计词数,一个字被定义为由空白、跳格或换行字符分隔的字符串
$ wc -l test.txt
date
$ date2019年12月22日 星期日 21时28分29秒 CST$ date '+%c'日 12/22 21:28:33 2019
cal
which
- which 是在 PATH 就是指定的路径中,搜索某个系统命令的位置,并返回第一个搜索结果。
- 使用 which 命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
$ which ls
/bin/ls
whereis
- whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
$ whereis locate
$ whereis -s locate
nl
- nl命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!
$ nl test.txt
find
$ find /user -name '*.log' -print
grep
- 强大的文本搜索命令,grep(Global Regular Expression Print) 全局正则表达式搜索
$grep '20:[0-5][0-9]:' *.log
$grep '20:[0-5][0-9]' 1.log 2.log 3.log
$ps -ef|grep java
$grep '20:[1-5][0-9]:' *.log | grep -v '20:[3-4][0-9]:'
$grep 'ab|bc' *.log
cut
- 从每个文件中剪切出每行的选定部分(由列表指定),并将它们写入标准输出。
-b :仅显示行中指定直接范围的内容;-c :仅显示行中指定范围的字符;-d —delimiter 指定分割符(默认是以tab键作为分割符)-f —fields 指定分割的区域(常和-d参数配合使用)- cut命令只支持单个分割符!
$ cat tmp.cc| >>tmp.cc|>>tmp.cc|>>tmp.cc|head -n10|>tmp.cc|cut -c7-7
$cut -c-10 tmp.txt
$cut -c3-5 tmp.txt
$cut -c3- tmp.txt
cut -d "|" -f 1
diff
$ diff testA.txt testB.txt
tar
- 用来压缩和解压文件。tar 本身不具有压缩功能,只具有打包功能,压缩及解压是调用其它的功能来完成。
打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件
$tar -cvf test.tar test.txt
$tar -xvf test.tar
$tar -zcvf test.tgz test.txt
$tar -zxvf test.tgz
gzip
- 创建一个
*.gz 的压缩文件:gzip test.txt - 解压
*.gz 文件:gzip -d test.txt.gz
unzip
- 解压
*.zip 文件:unzip test.zip 。 - 查看
*.zip 文件的内容:unzip -l jasper.zip
awk
- awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母
- awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。
- 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
- awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
- 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
使用方法
awk '{pattern + action}' {filenames}
- pattern 表示 AWK 在数据中查找的内容, action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
入门实例
last -n 5的输出如下:
显示最近登录的5个帐号:
awk工作流程:
- 读入有
\n 换行符分割的一条记录,然后将记录按指定的域分隔符划分域, - 填充域,
$0 则表示所有域$1 表示第一个域,$n 表示第n个域。 - 默认域分隔符是"空白键" 或 “[tab]键”,所以
$1 表示登录用户,$3 表示登录用户ip,以此类推。
sed
- sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾
- 文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
- sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用
-i 选项或者将结果重定向到新的文件中。
示例
sed 后面接的动作,请务必以‘’ 两个单引号括住!
$ nl /etc/passwd | sed '2,5d'
$ nl /etc/passwd | sed '2d'
$ nl /etc/passwd | sed '3,$d'
vim
打开文件、保存、关闭文件(vi命令模式下使用)
:w 保存文件:w vpser.net 保存至vpser.net文件:q 退出编辑器,如果文件已修改请使用下面的命令:q! 退出编辑器,且不保存:wq 退出编辑器,且保存文件
搜索(vi命令模式下使用)
-
/dong 向光标下搜索dong字符串,dong可以是正则表达式 -
?dong 向光标上搜索dong字符串 -
n 向下搜索前一个搜索动作 -
N 向上搜索前一个搜索动作 -
* (#) 当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入N 反方向查找. -
g*(g#) 此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而是匹配包含该单词的所有字符串.
跳至指定行(vi命令模式下使用)
-
n+ 向下跳n行 -
n- 向上跳n行 -
nG 跳到行号为n的行 -
G 跳至文件的底部
3、进程管理类(工作常用)
ps
- ps(process status),用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用 top
$ps -a
$ps -ef
ps -aux | grep kafka
keil
$ ps -ef | grep kafka
$ kill -9 pid
df
- 显示磁盘空间使用情况。获取硬盘被占用了多少空间,目前还剩下多少空间等信息,
$ df -h
du
- du 命令也是查看使用空间的,但是与 df 命令不同的是 : du 命令是对文件和目录磁盘使用的空间的查看.
$du -h filename
$du -h /
$du -sh
$du -sh ./
$du -ah /
lsof
- lsof(list open files)是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,即一切皆文件!
$ lsof
$ lsof /bin/bashCOMMAND
$ lsof -u username
$ lsof -c java
ping
ICMP(Internet Control Message Protocol)Internet控制消息协议。 它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
网络延时指**一个数据包从用户的计算机发送到网站服务器,然后再立即从网站服务器返回用户计算机的来回时间**。 通俗的讲,就是数据从电脑这边传到那边所用的时间。
$ ping -c 10 host
$ ping -c 10 -i 0.5 host
$ ping -c 4 -i 3 www.linuxcool.com
telnet
$ telnet 192.168.120.209
Trying 192.168.120.209...
telnet: connect to address 192.168.120.209: No route to host
telnet: Unable to connect to remote host: No route to host
netstat
在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询
$ netstat -a
$ netstat -nu
$ netstat -apu
$ netstat -i
ifconfig
ifconfig 用于查看和配置 Linux 系统的网络接口。
$ ifconfig
$ ifconfig eth0 up $ifconfig eth0 down
$ ifconfig eth0 ip
hostname
- 主机名用于显示系统的DNS名称,并显示或设置其主机名或NIS域名。
$ hostname -i
top
- 显示当前系统正在执行的进程的相关信息,包括进程 ID、内存占用率、CPU 占用率等
wget
wget命令用来从指定的URL下载文件
wget -c http://xxx.zip
curl
curl -d
4、特殊字符类
|
管道 (pipeline) ,连结上个指令的标准输出,做为下个指令的标准输入。
[ ]
常出现在流程控制中,扮演括住判断式的作用
[[ ]]
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用|| 与&& 逻辑等符号
\
反斜杠的作用是将特殊符号字符的特殊含义屏蔽掉,使其还是原字符
sh里没有多行注释,只能每一行加一个# 号
>
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。 **>> ** 把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。
&
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。
||
代表 or 逻辑的符号。
&&
代表 and 逻辑的符号
?
匹配一个任意的字符
-n
禁止插入换行符。
-e
对转义字符进行替换
5、shell脚本相关
#!/bin/bash
- #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
local
- 一般用于shell内局部变量的定义,多使用在函数内部
$
-
$ 直接引用变量 -
**$? 上一次命令的返回值。**0表示执行成功,非零值表示出错 -
$() 执行并获取命令输出赋值给变量 -
${} 作为单词边界 -
${#} 获取变量字符串长度 -
双引号" 括起来的字符串支持变量插值,被双引号用括住的内容,将被视为单一字串 -
单引号' 括起来的字符串不会进行插值 -
$[] 对表达式进行求值,与expr 命令不同的是,$[] 用于插值,而expr 则将值输出 -
$$ 获取当前进程ID
seq
for i in `seq 1 10`;
unset
sed
- 逐行从文件中读取数据, 再对数据处理后显示到屏幕, 再进行下一行的处理
echo "aab12" | sed `s/\(.*\)/\1/` -----> aab12
set
set指令能设置所使用shell的执行方式,可依照不同的需求来做设置
文件开头加上set -e ,这句语句告诉bash如果任何语句的执行结果不是true则应该退出,如果要增加可读性,可以使用set -o errexit ,它的作用与set -e 相同。
if
if [[ x"$var" == x"3"]];then
echo "$var"
fi
x 防止出现语法错误。如果不写x ,只用 if [ “${var}" == “0” ] 来判断${var} 的值,当${var} 为空或未设置时,语句被解释为if [ == "0" ] ,出现语法错误。加上x 后,当${var} 为空或未设置时,解释为 if [ “x" == "x" ] ,依然正确。
echo
- shell中打印变量的值,或者直接输出指定的字符串,需要使用
-e 参数来打印转义字符
echo `date`
echo -e "\n"
source
source FileName
mkdir
mkdir -p data/env
function
function demo(){
if [[ x"$var" == x"2" ]];then
echo "$var"
fi
}
tr
- translate,可以用来对一段文本进行替换、删除、压缩重复字符等
echo hello world 123 | tr -d '0-9'
hello world
echo hello world 123 | tr -d -c '0-9'
123
echo hello world | tr -s ' '
hello world
echo hello world | tr [a-zA-Z] [n-za-mN-ZA-M]
uryyb jbeyq
sync
pvcreate
- 用于将物理硬盘分区进行初始化为物理卷,供LVM使用
-f: 强制创建物理卷,不需要用户确认
-u: 设置设备的UUID
-y: 所有的问题都回答yes
vgreduce
mount
umount
lvcreate
- 创建LVM的逻辑卷
-l # 逻辑卷大小-n # 逻辑卷名字
mkfs
- make filesystem的缩写;用来在特定的分区建立Linux文件系统
mkfs.ext3 /dev/sda6
dmidecode
- 在Linux系统下**获取有关硬件方面的信息,**通过DMI,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。
lvs
- Linux Virtual Server的简称,也就是Linux虚拟服务器
exit
exit [状态值]
hash
rpm
- redhat package manager,是RPM软件包的管理工具
-i 显示套件的相关信息。-h 套件安装时列出标记-v 显示指令执行过程
6、正则匹配
^
^once
在一组方括号里使用 ^ 时,它表示"非"或"排除"的意思,常常用来剔除某个字符
^[^0-9][0-9]$
[^a-z]
[^\\\/\^]
[^\"\']
$
bucket$
^abcd$
\
所有的转义序列都用反斜杠 \ 打头
^\t
\n
\\
\.
?
匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
*
**匹配前面的子表达式零次或多次。例如,zo 能匹配 “z” 以及 “zoo”。 等价于{0,}。
+
与 {1,} 是相等的,匹配前面的子表达式一次或多次。
.
匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.|\n)"的模式。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’
{n}
前面的字符或字符簇只出现n次
{n,}
前面的内容出现n或更多的次数
{n,m}
前面的内容至少出现n次,但不超过m次
字符簇
[a-z]
[A-Z]
[a-zA-Z]
[0-9]
[0-9\.\-]
[ \f\r\t\n]
/[A-Za-z0-9]/
^[a-zA-Z_]$
^a$
^a{4}$
^a{2,4}$
^a{2,}$
^a{2,}
a{2,}
\t{2}
.{2}
^[a-zA-Z0-9_]+$
^[1-9][0-9]*$
^\-?[0-9]+$
^[-]?[0-9]+(\.[0-9]+)?$
7、实例经验分享
1、ssh连接远程服务器
ssh -l 用户名 -端口号 服务器ip
输入密码
2、远程连接服务器,后台运行命令,ssh断开,命令不中断
使用ssh连接远程服务器时,有时一个脚本要执行很长时间,如果没有放在后台独立运行,由于网络波动或者中断都有可能导致命令中断,所以在这里分享一个后台独立运行命令的Tip,亲测好用,棒棒哒!
方法1:nohup
nohup ./main &
此后,如果你断开了ssh,程序依旧运行。此种方式的缺点是,应用程序没有交互界面了,程序的输出将会输出的一个xxx.out文件中,而且以后无法在界面控制程序的结束。必须通过kill的方式。所以这种方式显得很简单粗鲁,很少使用。
方法2:screen
screen
回车后进入Screen子界面,此时putty标题栏会指示处于子界面状态,然后运行你的程序
./main
然后按下Ctrl+A后抬起,然后按下d键,此时切换回主界面,Putty的窗口标题栏也会指示。
进行其他的操作,或者exit
此时就是断开ssh,程序仍在运行。以后重新ssh连接后,输入
screen -ls
查看子界面的代号,然后输入
screen -r 子界面代号
就可以查看当初你程序运行所在的子界面了
3、统计目录下文件及文件夹的个数
Linux下有三个命令:ls 、grep 、wc 。通过这三个命令的组合可以统计目录下文件及文件夹的个数。
$ ls -l | grep "^-" | wc -l
$ ls -lR| grep "^-" | wc -l
$ ls -lR | grep "^d" | wc -l
命令解析:
长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录,ls -lR 是列出所有文件,包括子目录。
grep "^-" 过滤ls 的输出信息,只保留一般文件,只保留目录是grep "^d" 。wc -l 统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。
4、Linux下需要打开或者查看大文件,你会怎么做?
-
vim 会一次性把文件load到内存,不可取 -
cat会一次性输出文件的所有内容,用cat来读取16G的文件,你只能看到在屏幕上不断打印的内容,无法阅读。 -
如果只看文件的前一部分,用 head -n 就是最佳选择。 -
less/more并不需要加载全部文件,因此在打开大文件的时候,less/more具有优势。但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动
5、Linux怎么查看当前的负载情况?
-
使用top命令查看负载,在top下按“1”查看CPU核心数量,shift+"c"按cpu使用率大小排序,shif+"p"按内存使用率高低排序; -
使用iostat -x 命令来监控io的输入输出是否过大
6、linux指令统计日志出现的次数?
查找单词名称:test
操作命令:
(1)more xxx.log | grep -o test | wc -l
(2)cat xxx.log | grep -o test | wc -l
(3)grep -o test xxx.log | wc -l
7、查看端口号,你会使用什么命令?
方法1: lsof命令,即ls open files
$ lsof -i:端口号
方法2: netstat命令
$ netstat -tunpl | grep 端口号
8、创建shell脚本并运行
1.touch hello.sh
2.vim hello.sh
键入i
插入
echo hello world;
键入:
esc
:
wq
3.chmod 700 hello.sh//给予用户权限
4. 执行./hello.sh 或者执行 sh hello.sh
9、shell脚本比较两个数字
在 if-then 中使用测试命令( -gt 等)来比较两个数字。
#!/bin/bash //这一行 一定要有 ,表示命令通过 /bin/bash 来执行
x=10
y=20
if [ $x -gt $y ]
then
echo “x is greater than y”
else
echo “y is greater than x”
fi
#其他比较命令
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
在linux 中 命令执行状态:0 为真,其他为假
10、判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下?
read 命令可以读取来自终端(使用键盘)的数据。-p 后面跟提示信息,即在输入前打印提示信息。
#!/bin/bash
read -p "Input file name: " FILENAME
if [ -c "$FILENAME" ];then
cp $FILENAME /dev
fi
11、写一个 sed 命令,修改 /tmp/input.txt 文件的内容?
要求:
- 删除所有空行。
- 一行中,如果包含 “11111”,则在 “11111” 前面插入 “AAA”,在 “11111” 后面插入 “BBB” 。比如:将内容为 0000111112222 的一行改为 0000AAA11111BBB2222 。
[root@~]
1 000011111222
2
3 000011111222222
4 11111000000222
5
6
7 111111111111122222222222
8 2211111111
9 112222222
10 1122
11
[root@~]
000011111222
000011111222222
11111000000222
111111111111122222222222
2211111111
112222222
1122
[root@~]
0000AAA11111BBB222
0000AAA11111BBB222222
AAA11111BBB000000222
AAA11111BBBAAA11111BBB11122222222222
22AAA11111BBB111
112222222
1122
末
【面试系列】计算机网络(一) 【面试系列】计算机网络(二) 【面试系列】常考web安全问题总结 30道计网常考面试题总结
【面试系列】会持续更新,欢迎关注公众号“任冬学编程”,一起学习与进步!
|