介绍

  • 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
    4
    sed -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
    2
    sed -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
2
cmd="ls -a"
eval $cmd

这个例子看着多此一举,当然这里只是展示用法,当你真正遇到需要eval的场景时才能明白这个命令的强大
比如需要将一个命令传递给一个函数去执行,这将是你最好的选择

tar

通过直接使用tar命令打包一个路径下的文件时,会出现将绝对路径打包的现象
tar001
此时可以通过-C参数解决该问题,它是--directory的缩写
tar -zcf xxx.tar.gz -C /path/dir/ .
这里的.代表目录下所有文件,当然也可以选择个别文件
tar -zcf xxx.tar.gz -C /path/dir/ file
tar002

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 与打印服务有关的信息
mail 与电子邮件有关的信息
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
2
3
par1="aaa"
par2="bbb"
src="this is ${aaa} and $bbb"

需要注意的是如果需要变量赋值,那么外部只能使用双引号,单引号则会直接输出特殊字符
如果是批量的复杂的赋值操作,则可以用cat:

1
2
3
4
src=$(cat <<- EOF
this is ${aaa} and $bbb
EOF
)

bash中列出目录下所有文件夹

如果不考虑递归查找子目录,那么这里列出两个方法

1
2
3
4
5
6
7
8
9
10
11
12
# 方法1
dir=$(ls -l /usr/ |awk '/^d/ {print $NF}')
for i in $dir
do
echo $i
done

# 方法2
for dir in $(ls /usr/)
do
[ -d $dir ] && echo $dir
done

如果考虑需要将所有目录包括子目录都列出,那就可以用find:(当然find命令也可以实现上述需求)

1
2
3
4
5
dirpath=$(find /home/mine/work -type d)
for dirp in $dirpath
do
echo ${dirp##*/}
done

免密登录远程主机

以下均在客户端操作
首先创建公钥使用这个命令
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

参考