万家灯火
介绍
- Linux不经常使用但是必要时用的命令
- Linux常用的一些操作
命令篇
awk
- awk可以通过print进行输出操作,如果要输出第9个之后的参数,则需要用小括号,例如:
awk '{print $1,$2,$(10),$(11)}'
其中NF表示字段数量变量
$0代表所有列,$NF代表最后一列,$(NF-1)表示倒数第二列,以此类推! - 修改awk的分隔符,默认是空格,这里举例改成冒号:
awk -F ":" '{print $1, $3}'
- 输出N列之后的所有列
思路是把前N列都赋值为空,然后输出所有列awk '{for(i=1;i<=N;i++){$i=""}; print $0}' file
- 将第N列的所有项求和
`awk ‘{sum+=$N}END{print sum}’
sed
修改替换某个内容
1
2
3
4sed -i 's/old text/new text/' file # 替换匹配到的第一个
sed -i 's/old text/new text/g' file # 替换匹配到的所有行
sed -i 's/^abc.*/new text/g' file # 替换匹配到的abc开始的所有行
sed -i '5s/old text/new text/' file # 替换第五行匹配到的内容在匹配到的某行前后插入一行
格式:sed -i "/匹配的内容/i 添加的内容" file
其中 i 代表在前插入
如果替换成 a 代表在行后插入
例如:sed -i "/匹配的内容/a 添加的内容" file
1
2
3
4
5
6
7# 举例,注意如果不想修改文件,就不要加 '-i' 参数
sed -i '/hello/i world' file # 找到'hello'的这一行,给前面插入一行'world'
# 如果需要匹配开头字符,可以用 ^
# 如果开头字符前存在空格,可以用 [[:space:]]* 其中*表示有多个
# 如果要插入的内容前面需要空格,则使用 '\'
sed -i '/[[:space:]]*hello/i\ world' file # 找到开头' hello'这一行,给前面插入一行' world'
#在某一行号处插入内容
1
2sed -i '2i xxxx' file # 在第二行的上一行插入xxxx
sed -i '2a xxxx' file # 在第二行的下一行插入xxxx查看文件中某行
1
sed -n '100,200p' file # 查看文件100-200行的内容
sort
sort用来排列内容
常用参数:
- k 按第几列进行排序
- n 将内容当作数字排列
- r 降序排列,默认是升序
- t 指定分隔符,默认是空格
- u 删除所有重复行
- f 排序忽略大小写
uniq
uniq用来处理重复行数据
常用参数
- c 显示每行在文本中重复出现的次数
- d 设置每个重复纪录只出现一次
- f 跳过对前N个列的比较
- s 跳过对前N个字符的比较
- w 仅对前N个字符进行比较
- i 忽略大小写
- u 仅显示没有重复的纪录
eval
eval可以将字符串当作命令来执行
这在需要传参拼接命令字符串时非常有用
1 | cmd="ls -a" |
这个例子看着多此一举,当然这里只是展示用法,当你真正遇到需要eval的场景时才能明白这个命令的强大
比如需要将一个命令传递给一个函数去执行,这将是你最好的选择
tar
通过直接使用tar命令打包一个路径下的文件时,会出现将绝对路径打包的现象
此时可以通过-C
参数解决该问题,它是--directory
的缩写tar -zcf xxx.tar.gz -C /path/dir/ .
这里的.
代表目录下所有文件,当然也可以选择个别文件tar -zcf xxx.tar.gz -C /path/dir/ file
usermod
当你想把用户(usr)aaa添加到组(group)bbb中时
可以使用 usermod -aG bbb aaa
修改用户名 usermod -l new -d /home/new -m old
修改用户组 groupmod -n new old
gpasswd
如果不小心加错了,想将用户aaa从bbb组中移除
则可以使用这个 gpasswd -d aaa bbb
date
格式化输出时间date +"%Y-%m-%d"
其中:
- %H 小时(以00-23来表示)。
- %I 小时(以01-12来表示)。
- %K 小时(以0-23来表示)。
- %l 小时(以0-12来表示)。
- %M 分钟(以00-59来表示)。
- %P AM或PM。
- %s 总秒数。起算时间为1970-01-01 00:00:00 UTC。
- %S 秒(以本地的惯用法来表示)。
- %T 时间(含时分秒,小时以24小时制来表示)。
- %X 时间(以本地的惯用法来表示)。
- %d 日期(以01-31来表示)。
- %D 日期(含年月日)。
- %m 月份(以01-12来表示)。
- %x 日期(以本地的惯用法来表示)。
- %y 年份(以00-99来表示)。
- %Y 年份(以四位数来表示)。
- MM 月份(必要)
- DD 日期(必要)
- hh 小时(必要)
- mm 分钟(必要)
- ss 秒(选择性)
logger
logger可以将日志输出到rsyslog服务中去记录,例如logger -i -t "aaa" -p local2.info "This is a message"
常用参数:
- i 记录进程的pid
- t 添加额外的打印,可以记录进程名称
- p 日志等级
日志级别
facility | |
---|---|
auth | 用户授权 |
authpriv | 授权和安全 |
cron | 计划任务 |
daemon | 系统守护进程 |
kern | 与内核有关的信息 |
lpr | 与打印服务有关的信息 |
与电子邮件有关的信息 | |
news | 来自新闻服务器的信息 |
syslog | 由syslog生成的信息 |
user | 用户的程序生成的信息,默认 |
uucp | 由uucp生成的信息 |
local0~7 | 用来定义本地策略 |
level | |
---|---|
alert | 需要立即采取动作 |
crit | 临界状态 |
debug | 调试 |
emerg | 系统不可用 |
err | 错误状态 |
error | 错误状态 |
info | 正常消息 |
notice | 正常但是要注意 |
操作篇
Linux修改带有空格的文件名称
在linux上,如果文件名上带有空格,那么在命令行里进行处会遇到各种问题,最常见的就是匹配参数可能导致一个文件名被拆开匹配
通常,可以通过参数前后使用引号来解决,但是存批量匹配时还是会遇到拆开的场景
此时建议将文件名中的空格去掉或者修改为其他的字符,这里使用下划线_进行替换rename 's/ /_/g' /filepath
通过rename命令进行修改文件名称,filepath是你文件的路径,当然可以通配进行批量修改,灵活使用即可
如果你没有rename命令,或者不想安装这个命令,那其他还有方法,我没有研究过,研究后这里补充,这里指的批量修改哈
在bash中拼接字符串
最常用的方式就是这个:
1 | par1="aaa" |
需要注意的是如果需要变量赋值,那么外部只能使用双引号,单引号则会直接输出特殊字符
如果是批量的复杂的赋值操作,则可以用cat:
1 | src=$(cat <<- EOF |
bash中列出目录下所有文件夹
如果不考虑递归查找子目录,那么这里列出两个方法
1 | # 方法1 |
如果考虑需要将所有目录包括子目录都列出,那就可以用find:(当然find命令也可以实现上述需求)
1 | dirpath=$(find /home/mine/work -type d) |
免密登录远程主机
以下均在客户端操作
首先创建公钥使用这个命令ssh-keygen
接着一路回车即可
然后通过刚刚创建的公钥进行首次ssh登录ssh-copy-id -i ~/.ssh/xx.pub ip
首次登录需要输入密码,登录成功后再次登录则不需要密码
分卷压缩文件
这里用tar命令举例,其他压缩工具同理
首先正常使用压缩工具进行压缩对应的文件:tar -zcvf testfile.tar.gz files
然后再进行分卷,所以压缩和分卷实际上时两个动作,这里使用split
命令对文件进行分割split -b 100M -d -a 1 testfile.tar.gz testfile.tar.gz.
其中:
- -b, –bytes=SIZE, 指定每个分割文件的大小,单位有K、M、G、P等
- -d, –numeric-suffixes, 指定分割文件的后缀为数字
- -a, –suffix-length=N, 指定分割文件数字后缀的长度,如果是1,后缀为0,1,2…;如果是2,则为00,01,02…默认是2
- -C, –line-bytes=SIZE, 指定每行最大的字节数
- -l, –lines=NUMBER, 指定每个文件最大的行数
压缩后的分卷进行解压操作:cat testfile.tar.gz.* | tar -zxv