【基础知识】Linux的xargs命令

昨天在给服务器做年终“大扫除”整理时,发现有个目录下因为文件过多而删除失败,最终使用xargs才搞定,于是顺便来记录下。

在执行某些命令时,当 Linux 某个目录下文件过多就会因为“参数列表过长”而报错无法执行。比如,我要清空/var/spool/clientmqueue/下的庞大数量的临时文件, 如果直接执行rm -f *,有时就会会出现“参数列表过长”的错误提示,因为 linux 下一般的命令的参数的总长度不能超过 4096 个字节。

这时,xargs就应该上场了了,由于服务器数量很多,我直接在每台服务器上执行如下命令,即可清理此文件夹内的所有文件:

1
2
#代码中的$8,不通系统发行版本可能有所区别,具体使用 ls -l 查看文件名在那一列即可
cd /var/spool/clientmqueue/  && ls -l /var/spool/clientmqueue/ | awk {'print $8'} | xargs rm -f
Read more...

Oh My Zsh自动补全

shell 有多种,大多数人接触比较多的是 bash, 不管是 mac 还是各个 linux 发行版,默认的 shell 基本都是 bash, 虽然 bash 功能已经丰富了,但对于极客们来说,界面不够炫,提示功能也不够强大。而 zsh 功能及其强大,只是配置过于复杂, 后来就有了 oh-my-zsh 开源项目,配置难度大大降低。 Github地址: https://github.com/robbyrussell/oh-my-zsh 安装 1 sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 更改系统默认 shell 1 chsh -s /bin/zsh 更改zsh配置文件 1 vim ~/.zshrc 修改主题 1 ZSH_THEME="robbyrussell" 配置插件 oh-my-zsh 还支持插件,插件存放目录为: 1 ~/.oh-my-zsh/plugins 这个目录中每个子目录都是一个插件,目录名即为插件名,默认不开启,需要在~/.zshrc中该配置开启,比如: 1 2 3 4 5 6 7 8 9 10 11 plugins=( git git-flow docker kubectl brew npm helm zsh-autosuggestions zsh-syntax-highlighting ) 这些插件可以给你常用的命令做用法提示,使用 tab 键触发。我这里再推荐另外三个不是内置的插件, 需要将它们单独下载到~/.
Read more...

Grep无法查找shell传过来的变量?

差不多两周前,同事告诉我发现一个诡异的问题,grep 无法搜索 shell 中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行!

大概就是这样一个要求:

  1. 有个文本为 userid.txt,里面每一行一个用户 id,类似如下:
1
2
3
4
5
0001
0003
0005
0007
0009
  1. 另外还有一个文本为 record.txt,里面是所有用户的操作记录,一行一条,并且包含有 id,类似如下:
1
2
3
4
5
6
7
8
9
[12 11 2014 11:03,198 INFO] userId:0001 gilettype:3
[12 11 2014 12:12,198 INFO] userId:0002 gilettype:3
[12 11 2014 13:02,198 INFO] userId:0003 gilettype:1
[12 11 2014 14:33,198 INFO] userId:0001 gilettype:3
[12 11 2014 15:13,198 INFO] userId:0002 gilettype:2
[12 11 2014 16:43,198 INFO] userId:0003 gilettype:1
[12 11 2014 17:32,198 INFO] userId:0001 gilettype:3
[12 11 2014 18:16,198 INFO] userId:0002 gilettype:1
[12 11 2014 19:25,198 INFO] userId:0003 gilettype:2
Read more...

用cat命令查看不可见字符

时常,某个程序或软件并没有语法错误,并且你检查它的相关内容也确实没有发现问题。 这是因为你用普通文本编辑器软件来查看的时候,有许多字符没有显示出来,但在终端使用 cat 命令可以很容易地检测出是否存在这些字符。 首先,我们创建一个简单的文本文件,写入一些特殊字符。打开终端,运行命令: 1 printf 'testing\012\011\011testing\014\010\012more testing\012\011\000\013\000even more testing\012\011\011\011\012' > /tmp/testing.txt 现在用不同的编辑器软件打开,显示的结果会不同。用简单的 cat 打开将显示: 1 2 3 4 5 $ cat /tmp/testing.txt testing testing more testing even more testing 如果用 nano 或者 vim 打开,将会看到: 1 2 3 4 testing testing^L^H more testing ^@^K^@even more testing 现在我们给 cat 加上一些选项参数,以便能显示出特殊字符来。 用 cat -T 命令来显示 TAB 键的字符^I 1 2 3 4 5 6 cat -T /tmp/testing.txt testing ^I^Itesting more testing ^I even more testing ^I^I^I 用 cat -E 命令来显示行尾的结束字符$
Read more...

初学awk编程

  • awk命令

基本格式就这两种

1
2
3
4
awk -F'<默认是空格,这里可正则表达式也可字符>' 'commands' file(s)

# 也可以用管道,
ll -t | awk -F':' '{print $2}'

通常awk做文本处理前还需要做一次过滤。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
awk -F':' '/<正则表达式or普通字符串>/{print $1}' /ect/passwd

# 例如,我先用SQL为关键字做一次过滤
awk -F':' '/SQL/{print $1, $5}' /etc/passwd
#_mysql MySQL Server
#_postgres PostgreSQL Server

# 现在匹配有zF字符的文本
awk -F':' '/[zF]/{print $1, $5}' /etc/passwd
#_ftp FTP Daemon
#_timezone AutoTimeZoneDaemon
#_krbfast Kerberos FAST Account
Read more...