目录
2024年3月10日
|
|
Xshell常用快捷键:
部分快捷键:
Ctrl+f 向后移动一个字符
Ctrl+b 向前移动一个字符
Ctrl+a 将光标移至输入行头,相当于Home键
Ctrl+e 将光标移至输入行末,相当于End键
Alt+f 以单词为单位,向前移动
Alt+b 以单词为单位,向前移动
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动
Alt+s 切换到简单版模式
Alt+Enter 切换至全屏
Ctrl+s 锁住终端,可用来停留在当前屏
Ctrl+q 解锁终端,恢复刷屏
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂停当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+Shift+r 重新连接
Ctrl+Insert 复制
Shift+Insert 粘贴
命令ls 列出文件
ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件
ls a* 列出当前目录下以字母a开头的所有文件
ls -l *.doc 给出当前目录下以.doc结尾的所有文件
命令cp 复制文件
cp afile afile.bak 把文件复制为新文件afile.bak
cp afile /home/bible/ 把文件afile从当前目录复制到/home/bible/目录下
cp * /tmp 把当前目录下的所有未隐藏文件复制到/tmp/目录下
cp -a docs docs.bak 递归性地把当前目录下的docs目录复制为新目录docs.bak,保持文件属性,并复制所有的文件,包括以句点开头的隐藏文件。为了方便起见,-a选项包含-R选项
cp -i 在覆盖前询问用户
cp -v 告诉用户正在做什么
命令mv 移动和重命名文件
mv aflie bfile 将afile重命名为bfile
mv afile /tmp 把当前目录下的afile移动到/tmp/目录下
命令rm 删除文件和目录
rm afile 删除文件afile
rm * 删除当前目录下的所有文件(未隐藏文件)。rm命令不删除目录,除非也指定了-r(递归)参数。
rm -rf domed 删除domed目录以及它所包含的所有内容
rm -i a* 删除当前目录下所有以字母a开头的文件,并且在每次删除时,提示用户进行确认
命令cd 更改目录
cd ~ 切换到主目录
cd /tmp 切换到目录/tmp
cd dir 切换到当前目录下的dir目录
cd /切换到根目录
cd .. 切换到到上一级目录
cd ../.. 切换到上二级目录
cd ~ 切换到用户目录,比如是root用户,则切换到/root下
命令mkdir 建立目录
mkdir phots 在当前目录中建立名为photos的目录
mkdir -p this/that/theother 在当前目录下建立指定的嵌套子目录
命令mkdir 删除目录
mkdir 将删除空目录
命令more、less 查看文件内容
more /etc/passwd 查看/etc/passwd的内容
功能:分页显示命令
more file
more命令也可以通过管道符(|)与其他的命令一起使用,
例如:ps ux|more
ls|more
less /etc/passwd 查看/etc/passwd的内容
命令grep 搜索文件内容
grep bible /etc/exports 在文件exports中查找包含bible的所有行
tail -100 /var/log/apache/access.log|grep 404 在WEB服务器日志文件access.log的后100行中查找包含“404”的行
tail -100 /var/log/apache/access.log|grep -v googlebot 在WEB服务器日志文件access.log的后100行中,查找没有被google访问的行
grep -v ^# /etc/apache2/httpd.conf 在主apache配置文件中,查找所有非注释行 (10)命令find——查找文件
find .-name *.rpm 在当前目录中查找rpm包
find .|grep page 在当前目录及其子目录中查找文件名包含page的文件 locate traceroute 在系统的任何地方查找文件名包含traceroute的文件
命令vi 编辑文件
vi /etc/bubby.txt 用vi编辑文件/etc/bubby.txt
vim /etc/bubby.txt 用vi编辑文件/etc/bubby.txt
快捷操作:
切换窗口:alt+1,alt+2
全屏:alt+回车
将vim挂起(暂停):ctrl+z,暂停后可进行其他shell操作,完了之后可通过 fg 命令切换回vim界面继续编辑
:MR查看历史文件记录(注意:MR大写)
:sp 横向切换界面窗口
:vsp 纵向切换界面窗口
emacs /etc/bubby.txt 用emacs编辑文件/etc/bubby.txt
命令rz、sz 文件上传下载
Sudo rz即是接收文件,xshell就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到Linux里的当前目录 。
Sudo sz file 就是发文件到windows上(保存的目录是可以配置)
比ftp命令方便多了,而且服务器不用再开FTP服务了。
命令cat 显示文件内容
cat file
命令ps 查看进程
ps [options]
DESCRIPTION(描述):ps命令显示运行程序选项的一些信息。如果你想显示选项的一些重复信息,请使用top命令替代。 用标准语法查看系统上的每一个进程。
- ps -e
- ps -ef
- ps -eF
- ps -ely
命令kill 杀掉进程
[root@linux ~]# kill -signal %jobnumber
[root@linux ~]# kill -l
参数: -l :这个是 L 的小写,列出目前 kill能够使用的讯号 (signal) 有哪些?共有62个信号。
signal:代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1:重新读取一次参数的设定档 (类似 reload);
-2 :代表与由键盘输入[ctrl]-c同样的动作;
-9:立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
范例一:找出目前的 bash环境下的背景工作,并将该工作删除。
[root@linux ~]# jobs
[1]+ Stopped vim bashrc [root@linux ~]# kill -9 %1
[1]+ 已砍掉 vim bashrc
命令stop、start
tomcat ./catalina.sh stop 停止
./catalina.sh start 重启
命令top 查看cpu、内存
top
命令pwd 查看当前路径
pwd
命令tar 打包、解包rar
tar -cvf **.tar a.jsp b.java 将a和b打成**.rar
tar -xvf **.tar a.jsp b.java 将**.tar 解包
命令tail 查看文件详细信息
tail -f aaa.txt
看aaa.txt文件的详细信息tail -n x aaa.log
x:最后几行
命令head 查看文件的名字和后缀
head -n x aaa.log
x:开始几行aaa.log:要查看的文件的名字和后缀
命令diff 比较文件内容
diff dir1 dir2 比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出
diff file1 file2 比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的
comm file1 file2 比较文件,显示两个文件不相同的内容
命令ln 建立连接
ln source_path target_path 硬连接
ln -s source_path target_path 软连接
命令touch 创建一个空文件
touch aaa.txt 创建一个空文件,文件名为aaa.txt
基本系统命令
man 查看某个命令的帮助
man ls 显示ls命令的帮助内容
w 显示登录用户的详细信息
Sarge:~# w
who 显示登录用户
Sarge:~# who
last 查看最近那些用户登录系统
Sarge:~# last
date 系统日期设定
date -s “060520 06:00:00″设置系统时期为2006年5月20日6点整。
clock 时钟设置
clock –r 对系统Bios中读取时间参数
clock –w 将系统时间(如由date设置的时间)写入Bios
uname 查看系统版本
uname -r 显示操作系统内核的version
reboot、shutdown 关闭和重新启动计算机
reboot 重新启动计算机
shutdown -r now 重新启动计算机,停止服务后重新启动计算机
shutdown -h now 关闭计算机,停止服务后再关闭系统
halt 关闭计算机
一般用shutdown -r now,在重启系统是,关闭相关服务,shutdown -h now也是如此。
su 切换用户
su - 切换到root用户
su – zhoulj切换到zhoulj用户
注意:-,他很关键,使用-,将使用用户的环境变量
free 查看内存和swap分区使用情况
Sarge:~# free -tm
uptime 现在的时间
Sarge:~# uptime
系统开机运转到现在经过的时间,连线的使用者数量,最近一分钟,五分钟和十五分钟的系统负载
vmstat 监视虚拟内存使用情况
vmstat
iostat 磁盘吞吐量
-c 只显示CPU行
-d 显示磁盘行
-k 以千字节为单位显示磁盘输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
clear 清屏
重启tomcat,变更使用者chown
变更文件或目录的拥有者或所属群组
chown改变使用者:
chown -R -h owner file
- R(recursive)选项意味着对所有子目录下的文件也都进行同样的操作。
- h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件
chown -R xh test1 (test1目录及子目录的所有文件属主变为xh)
查看要重启进程的进程号 Ps –ef|grep xxxx
杀掉该项目的进程
先杀第二列,再杀第一列 Sudo kill -9 x x
(x为进程号,同时杀多个中间以空格分割)
3.重启tomcat
首先找到tomcat的bin目录 Cd tomcat/bin
然后运行 sudo ./run.sh即可启动tomcat
编辑:
crontab -e
i进入编辑模式
esc 退出编辑模式
:wq 退出并保存
:q! 退出不保存
2024年3月10日
|
|
Linux三剑客(grep awk sed):
grep
awk
sed
grep:擅长单纯的查找或匹配文本内容
sed:更适合编辑、处理匹配到的文本内容
awk:更适合格式化文本内容,对文本进行复杂处理
简述:
1.Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
2.AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
3.Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。(能对文件实现快速增删改查)
自己做的笔记:
sed:
s/[正则]/[替换的内容]/g ==替换
/[内容]/d ==删除
"[n][ai] [添加的内容]" ==增加(a在下面插入,i在前面插入)
"[n]a [内容]" 匹配所有,在每一行下面插入,i相反
awk
awk [option] 'pattern[action]' file …
awk 参数 '条件动作 ' 文件
grep:
grep [options] [pattern] [files]
或 grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
pattern - 表示要查找的字符串或正则表达式。
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
常用选项::
-i:忽略大小写进行匹配。
-v:反向查找,只打印不匹配的行。
-n:显示匹配行的行号。
-r:递归查找子目录中的文件。
-l:只打印匹配的文件名。
-c:只打印匹配的行数。
更多参数说明:
-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。
实例
1、在文件 file.txt 中查找字符串 "hello",并打印匹配的行:grep hello file.txt
2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 "pattern" 的行,并打印匹配行所在的文件名和行号:grep -r -n pattern dir/
3、在标准输入中查找字符串 "world",并只打印匹配的行数:echo "hello world" | grep -c world
4、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:grep test *file
结果如下所示:$ grep test test* #查找前缀有“test”的文件包含“test”字符串的文件 testfile1:This a Linux testfile! #列出testfile1 文件中包含test字符的行 testfile_2:This is a linux testfile! #列出testfile_2 文件中包含test字符的行 testfile_2:Linux test #列出testfile_2 文件中包含test字符的行
5、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:grep -r update /etc/acpi
输出结果如下:$ grep -r update /etc/acpi #以递归的方式查找“etc/acpi” #下包含“update”的文件 /etc/acpi/ac.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/resume.d/85-anacron.sh:# (Things like the slocate updatedb cause a lot of IO.) Rather than /etc/acpi/events/thinkpad-cmos:action=/usr/sbin/thinkpad-keys--update
6、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。
查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:grep -v test *test*
结果如下所示:$ grep-v test* #查找文件名中包含test 的文件中不包含test 的行 testfile1:helLinux! testfile1:Linis a free Unix-type operating system. testfile1:Lin testfile_1:HELLO LINUX! testfile_1:LINUX IS A FREE UNIX-TYPE OPTERATING SYSTEM. testfile_1:THIS IS A LINUX TESTFILE! testfile_2:HELLO LINUX! testfile_2:Linux is a free unix-type opterating system.
awk:
语法
awk [选项参数] 'script' var=value file(s) 或 awk [选项参数] -f scriptfile var=value file(s)
选项参数说明:
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。
-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。
-W lint or --lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or --version
打印bug报告信息的版本。
基本用法
log.txt文本内容如下:2 this is a test 3 Do you like awk This's a test 10 There are orange,apple,mongo
用法一:awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
实例:# 每行按空格或TAB分割,输出文本中的1、4项 $ awk '{print $1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo # 格式化输出 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt --------------------------------------------- 2 a 3 like This's 10 orange,apple,mongo
用法二:awk -F #-F相当于内置变量FS, 指定分割字符
实例:# 使用","分割 $ awk -F, '{print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Do you like awk This's a test 10 There are orange apple # 或者使用内建变量 $ awk 'BEGIN{FS=","} {print $1,$2}' log.txt --------------------------------------------- 2 this is a test 3 Do you like awk This's a test 10 There are orange apple # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割 $ awk -F '[ ,]' '{print $1,$2,$5}' log.txt --------------------------------------------- 2 this test 3 Are awk This's a 10 There apple
用法三:awk -v # 设置变量
实例: $ awk -va=1 '{print $1,$1+a}' log.txt --------------------------------------------- 2 3 3 4 This's 1 10 11 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt --------------------------------------------- 2 3 2s 3 4 3s This's 1 This'ss 10 11 10s
用法四:awk -f {awk脚本} {文件名}
实例: $ awk -f cal.awk log.txt
sed:
语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!
实例
我们先创建一个 testfile 文件,内容如下:$ cat testfile #查看testfile 中的内容 HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test Google Taobao Runoob Tesetfile Wiki
在 testfile 文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:sed -e 4a\newLine testfile
使用 sed 命令后,输出结果如下:$ sed -e 4a\newLine testfile HELLO LINUX! Linux is a free unix-type opterating system. This is a linux testfile! Linux test newLine Google Taobao Runoob Tesetfile Wiki
以行为单位的新增/删除
将 testfile 的内容列出并且列印行号,同时,请将第 2~5 行删除!$ nl testfile | sed '2,5d' 1 HELLO LINUX! 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
sed 的动作为 2,5d,那个 d 是删除的意思,因为删除了 2-5 行,所以显示的数据就没有 2-5 行了, 另外,原本应该是要下达 sed -e 才对,但没有 -e 也是可以的,同时也要注意的是, sed 后面接的动作,请务必以 '...' 两个单引号括住喔!
只要删除第 2 行:$ nl testfile | sed '2d' 1 HELLO LINUX! 3 This is a linux testfile! 4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
要删除第 3 到最后一行:$ nl testfile | sed '3,$d' 1 HELLO LINUX! 2 Linux is a free unix-type opterating system.
在第二行后(即加在第三行) 加上drink tea? 字样:$ nl testfile | sed '2a drink tea' 1 HELLO LINUX! 2 Linux is a free unix-type opterating system. drink tea 3 This is a linux testfile! 4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
如果是要在第二行前,命令如下:$ nl testfile | sed '2i drink tea' 1 HELLO LINUX! drink tea 2 Linux is a free unix-type opterating system. 3 This is a linux testfile! 4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ..... 与 drink beer?$ nl testfile | sed '2a Drink tea or ......\ drink beer ?' 1 HELLO LINUX! 2 Linux is a free unix-type opterating system. Drink tea or ...... drink beer ? 3 This is a linux testfile! 4 Linux test 5 Google 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
每一行之间都必须要以反斜杠 \ 来进行新行标记。上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。
以行为单位的替换与显示
将第 2-5 行的内容取代成为 No 2-5 number 呢?$ nl testfile | sed '2,5c No 2-5 number' 1 HELLO LINUX! No 2-5 number 6 Taobao 7 Runoob 8 Tesetfile 9 Wiki
透过这个方法我们就能够将数据整行取代了。
仅列出 testfile 文件内的第 5-7 行:$ nl testfile | sed -n '5,7p' 5 Google 6 Taobao 7 Runoob
可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。
数据的搜寻并显示
搜索 testfile 有 oo 关键字的行:$ nl testfile | sed -n '/oo/p' 5 Google 7 Runoob
如果 root 找到,除了输出所有行,还会输出匹配行。
数据的搜寻并删除
删除 testfile 所有包含 oo 的行,其他行输出$ nl testfile | sed '/oo/d' 1 HELLO LINUX! 2 Linux is a free unix-type opterating system. 3 This is a linux testfile! 4 Linux test 6 Taobao 8 Tesetfile 9 Wiki
数据的搜寻并执行命令
搜索 testfile,找到 oo 对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把 oo 替换为 kk,再输出这行:$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}' 5 Gkkgle
最后的 q 是退出。
数据的查找与替换
除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的查找与替换<。
sed 的查找与替换的与 vi 命令类似,语法格式如下:sed 's/要被取代的字串/新的字串/g'将 testfile 文件中每行第一次出现的 oo 用字符串 kk 替换,然后将该文件内容输出到标准输出:sed -e 's/oo/kk/' testfile
g 标识符表示全局查找替换,使 sed 对文件中所有符合的字符串都被替换,修改后内容会到标准输出,不会修改原文件:sed -e 's/oo/kk/g' testfile
选项 i 使 sed 修改文件:sed -i 's/oo/kk/g' testfile
批量操作当前目录下以 test 开头的文件:sed -i 's/oo/kk/g' ./test*
接下来我们使用 /sbin/ifconfig 查询 IP:$ /sbin/ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 .....(以下省略).....
本机的 ip 是 192.168.1.100。
将 IP 前面的部分予以删除:$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
接下来则是删除后续的部分,即:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。
将 IP 后面的部分予以删除:$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 192.168.1.100
多点编辑
一条 sed 命令,删除 testfile 第三行到末尾的数据,并把 HELLO 替换为 RUNOOB :$ nl testfile | sed -e '3,$d' -e 's/HELLO/RUNOOB/' 1 RUNOOB LINUX! 2 Linux is a free unix-type opterating system.
-e 表示多点编辑,第一个编辑命令删除 testfile 第三行到末尾的数据,第二条命令搜索 HELLO 替换为 RUNOOB。
直接修改文件内容(危险动作)
sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由于这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!
regular_express.txt 文件内容如下:$ cat regular_express.txt runoob. google. taobao. facebook. zhihu- weibo-
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !$ sed -i 's/\.$/\!/g' regular_express.txt $ cat regular_express.txt runoob! google! taobao! facebook! zhihu- weibo-:q:q
利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:$ sed -i '$a # This is a test' regular_express.txt $ cat regular_express.txt runoob! google! taobao! facebook! zhihu- weibo- # This is a test
2024年3月7日
正则表达式:
正则表达式入门:
\d:匹配任意数字(0-9)
\w:匹配任意单词(单词:匹配字母、数字、下划线)
\s快捷方式可以匹配空白字符,比如空格,tab、换行等
\b 匹配的是单词的边界(\bmaster\b 就仅匹配有边界的master单词)
快捷方式也可以取反,例如对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则
开始和结束^ $:
^指定的是一个字符串的开始,
$指定的是一个字符串的结束。
任意字符.:
.字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: .字符只有一个不能匹配的字符,也就是换行符(\n),不过要让.字符与换行符匹配也是可以的,以后会讨论。
可选字符?:
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。(在这里 u? 表示u是可选的,即可以出现也可以不出现,可以匹配的是 honor 和 honour 。通过这个案例可以知道?的作用就是匹配它之前的字符0次或1次。)
重复字符{}:
在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
重复区间{ , }:
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。
这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。
举个例子:
\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号。
开闭区间:
有时候我们可能遇到字符组的重复次数没有边界,例如:
闭区间不写即可表示匹配一个或无数个。
速写:
还可以使用两个速写字符指定常见的重复情况,可以使用 + 匹配1个到无数个,使用 *代表0个到无数个。
即:+等价于{1,},*等价于{0,}。
+号示例:
*号示例:
总结(多种匹配模式):
实例 描述
[Pp]ython 匹配 “Python” 或 “python”。
rub[ye] 匹配 “ruby” 或 “rube”。
[abcdef] 匹配中括号内的任意一个字母。
[0-9] 匹配任何数字。类似于 [0123456789]。
[a-z] 匹配任何小写字母。
[A-Z] 匹配任何大写字母。
[a-zA-Z0-9] 匹配任何字母及数字。
[^au] 除了au字母以外的所有字符。
[^0-9] 匹配除了数字外的字符。
实例 描述
. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
? 匹配一个字符零次或一次,另一个作用是非贪婪模式
+ 匹配1次或多次
* 匹配0次或多次
\b 匹配一个长度为0的子串
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
分组:
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
要实现分组很简单,使用()即可。
例如:
这段正则表达式将文本分成了两组,第一组为:0731,第二组为8825951。
分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。
(\d{4}) 和 (\d{7})就分别捕获了两段数据:
0731
8825951
或者条件:
使用分组的同时还可以使用 或者(or)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:
非捕获分组:
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:
分组使用技巧:
日期可以有很多格式,例如:
20200102
2020-01-02
2020-1-2
2020.01.02
2020 01 02
2020 1 2
2020/01/02
Copy
现在我们想要使用正则表达式将其中的年月日全都提取出来。
可以发现他们唯一的区别就在于分隔符和月份与日期,这个时候可以使用[]来匹配多种情况。
例如:
通过(\d{4})[-./\s]?(\d{1,2})[-./\s]?(\d{1,2}) 就可以从文本中将年月日分别提取出来了。
虽然这段正则表达式看起来内容挺多,但是还是很容易理解的,[-./\s]表示匹配三个可能出现的分隔符-./和空白,?表示匹配它们0次或者1次,其他年月日的数据使用\d{N}与分组结合就可以提取到目标数据。
分组的回溯引用:
正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。
例如,要匹配一段 HTML 代码,比如:0123<font>提示</font>abcd,可能会编写出这样一段正则表达式:
这确实可以匹配,不过可能还有另一种情况,如果数据改成这样:<font>提示</bar>
在这里font 和 bar 明显不是一对正确的标签,但是我们编写的正则表达式还是将它们给匹配了,所以这个结果是错误的。
我们想让后面分组的正则也匹配font,但是现在所有形式的都会匹配。
那如果想让后面分组的正则和第一个分组的正则匹配同样的数据该如何做呢?
可以使用分组的回溯引用,使用\N可以引用编号为N的分组,因此上述例子的代码我们可以改为:
通过这个例子,可以发现 \1 表示的就是第一个分组,在这里第一个分组匹配的是 font 所以\1 就代表font。
正向先行断言:
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
正向先行断言
反向先行断言
正向后行断言
反向后行断言
正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你),这就是正向先行断言。
提取包含大小写字母的字符串
先行断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:
(?=.*?[a-z])(?=.*?[A-Z]).+ 这段正则表达式规定了匹配的字符串中必须包含至少一个大写和小写的字母。
反向先行断言:
反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你),这就是反向先行断言。
正向后行断言:
本小节只需要你记住一句话:先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
正向后行断言:
(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)。
反向后行断言:
反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)。
返回顶部
常用正则表达式:
一、校验数字的表达式
数字:^[0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非负整数:^\d+$ 或 ^[1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
校验字符的表达式
汉字:^[\u4e00-\u9fa5]{0,}$
英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
长度为3-20的所有字符:^.{3,20}$
由26个英文字母组成的字符串:^[A-Za-z]+$
由26个大写英文字母组成的字符串:^[A-Z]+$
由26个小写英文字母组成的字符串:^[a-z]+$
由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
禁止输入含有~的字符:[^~]+
三、特殊需求表达式
Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?
InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
手机号码:^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$
电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
日期格式:^\d{4}-\d{1,2}-\d{1,2}
一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
钱的输入格式:
有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
中文字符的正则表达式:[\u4e00-\u9fa5]
双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
空白行的正则表达式:\n\s*\r (可以用来删除空白行)
HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
返回顶部
2024年3月6日
2024-1-6
(笔记本上的Linux笔记)
|:管道符
grep:横着切(把哪一行切出来)
cut:竖着切(把哪一列切出来)
grep:
选项与参数:
-v:反向选择
-w:精确匹配(默认模糊匹配)
-i:忽略大小写
正则表达式: cat /etc/passwd | grep ^pS
(其中^p,切出第1列以p开头的;p*,把所有都切出来)
cut:
cat /etc/passwd | cut -d : -f1 (以:作为分隔-f1切出第1列)
echo $RANDOM | md5sum | cut -c 1-12(还可以cut -c 1,5,7或者cut -c 1,5-7)
选项与参数:
-c:以字符为单位进行分割
-d:自定义分隔符
-f:与d一起使用,指定显示哪个区域
字符串处理三剑客:grep awk sed
awk :
awk 'print $2'
sort:(排序)
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-o:如果输入的stdin含有特殊字符,例如 · ; / , [空格键] 等等字符时,这个-o参数,可以将他还原成一般字符,这个参数可以用于特殊状态。
-e:这个是EOF(end of file)的意思,后面可以接一个字符串,当xargs分析到这个字符时,就会停止继续工作。
-p:在执行每个指令的argument时,都会询问使用者的意思。
-n:后面接次数,每次command指令执行时,要使用几个参数的意思。
当xargs后面没有接任何的指令时,默认是echo来进行输出。
sed:(未记录):
find:(在目录中搜索文件)
find [搜索路径] [选项] [搜索的内容]
选项与参数:
-name:按照文件名搜索
-iname:安装文件名搜索,不区分文件名大小写
-inum:按照inode号搜索
which:(寻找执行文档)
which [- a] command
选项与参数:
-a:将所有由PATH目录中可以找到的指令可以找到的指令均列出,而不止第一个被找到的指令名称。
whereis:(由一些特定的目录中寻找文件,文件名)
whereis [-bmsu] [文件或目录名]
选项与参数:
-l:可以列出whereis会去查询的几个主要目录而已
-b:只找binary格式的文件
-m:只找在说明文件manual路径下的文件
-s:只找source来源文件
-u:搜寻不在上述三个项目当中的其他特殊文件
2024年3月2日
usermod -d #指定的家目录
userdel -r [用户名]#删除用户带家目录
useradd -M [用户名]#创建一个用户不附带家目录
chage -l [用户名]#查看该用户信息信息
lock:锁
passwd -l [用户名]#锁住该用户