我正在帮助这里的网络管理员使用 perl 正则表达式自动操作来自我们 SAN 的一些快照,我们的脚本执行如下操作:
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')
Run Code Online (Sandbox Code Playgroud)
快照的签名中有两部分,一个嵌套在另一个中,我们使用捕获组来捕获名称和需要执行的不同后续命令的名称的一部分。我知道它一遍又一遍地运行相同的命令,并且可以稍后清理正则表达式,但基本上他们使用 perl 来输出一个括号和另一个。
tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)
想要从 icsiadm 和 grep 的结果中捕捉到这个:
iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)
和
r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
Run Code Online (Sandbox Code Playgroud)
我们遇到的问题是,有时通往第一行的管道会失败:
head: cannot open '–n1' for reading: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当然,这似乎表明 stdin to head 为空,因此它正在寻找文件名。
但它没有理由永远是空的。
如果我们做这样的事情:
varinit1=$(iscsiadm -m session | grep …Run Code Online (Sandbox Code Playgroud) 如果我做一个
svn log | head
Run Code Online (Sandbox Code Playgroud)
在第十行输出后,我收到一条错误消息:
svn: Write error: Broken pipe
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我还没有看到任何其他命令在与head. Subversion 对 Unix 过滤范式不友好吗?
多亏了其他人,我的“彩色猫”工作得很好
(请参阅如何为 cat 输出着色,包括黑白中的未知文件类型?)。
在我的.bashrc:
cdc() {
for fn in "$@"; do
source-highlight --out-format=esc -o STDOUT -i $fn 2>/dev/null || /bin/cat $fn;
done
}
alias cat='cdc' # To be next to the cdc definition above.
Run Code Online (Sandbox Code Playgroud)
我希望能够将此技术用于其他功能,例如 head、tail 和 less。
我怎么能对所有四个功能都做到这一点?有什么方法可以概括答案吗?
我有一个选择gd做git diff使用
gd() {
git diff -r --color=always "$@"
}
Run Code Online (Sandbox Code Playgroud) 我目前有一个压缩文件,A.gz其中包含大量列表数据,包括第一行的标题。我想创建另一个文件,B.gz,它具有与前一个文件相同的数据,但具有不同的标题。
执行此操作的简单方法是解压缩所有A.gz, -tail除第一行之外的所有内容,然后重新压缩所有内容。然而,这似乎效率低下,特别是因为两个gzip-ed 文件的连接正确地解压缩为解压缩版本的连接。
我想知道是否有办法做到这一点与此类似:
zcat A.gz | head -n 1 | process_header | gzip > B.gz
cat A.gz | (remove compressed header) >> B.gz
Run Code Online (Sandbox Code Playgroud)
无需解压所有A.gz.
假设我只需要输出的前 5 行用于日志记录。我还需要知道日志是否以及何时被截断。
我正在尝试使用它head来完成这项工作,seq下面的命令输出 20 行被 截断的行head,并且我echo截断了信息:
> seq -f 'log line %.0f' 20 | head -n 5 && echo '...Output truncated. Only showing first 5 lines...'
log line 1
log line 2
log line 3
log line 4
log line 5
...Output truncated. Only showing first 5 lines...
Run Code Online (Sandbox Code Playgroud)
但是如果seq命令输出少于 5 行,使用上述相同的结构,我会得到一个错误的“截断”状态:
seq -f ' log line %.0f' 3 | head -n 5 && echo '...Output truncated. Only showing first …Run Code Online (Sandbox Code Playgroud) 我有一个秤,可以通过串行端口连续发送数据,每秒 2 次。读取此数据的唯一可靠方法碰巧是cat命令。以下工作:
cat /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
但问题cat在于,由于它没有收到EOF,它会继续检索数据。我也试过head,read和tail。
head -1 /dev/ttyUSB0 | strings
Run Code Online (Sandbox Code Playgroud)
“几乎”每次都可以工作,但有时会显示旧数据,只有重新运行 cat 命令才能修复它(?)。管道后的字符串仅检索可打印数据。
read line < /dev/ttyUSB0 | echo $line
Run Code Online (Sandbox Code Playgroud)
现在不时检索数据,但大多数时候只显示一个空行。
tail -1 < /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
只是冻结,等待EOF,也许?
我的问题是我需要编写一个bash可以调用和“读取”/dev/ttyUSB0和检索数据的脚本。我要使用head. 但我想知道,cat如果有一种方法可以只捕获一行cat输出然后停止它,那么永远不会失败。
注:端口配置为 9600 波特,1 个起始位,8 个数据位,无奇偶校验,2 个停止位。要正确设置端口,这是命令:
sudo stty -F /dev/ttyUSB0 9600 -parity cs8 cstopb
Run Code Online (Sandbox Code Playgroud) 例如,我们有 N 个文件(file1, file2, file3 ...)
我们需要前 20%,结果目录应该是 (file1_20, file2_20, file3_20 ...)。
我在想wc用来获取文件的行,然后乘以 0.2
然后使用head20% 然后重定向到一个新文件,但我不知道如何自动化它。
我正在寻找一个命令来.png使用显示三个文件xxd,分别显示十六进制的前两行和最后两行。
我使用下面的命令一次显示一个文件,但我想知道是否有一个命令可以同时显示所有三个文件。到目前为止,这是我的命令:
de@Classbox:/mnt/mountpoint/pics$ xxd albert-grumpy-cat.png |head -n2 && tail -n2
Run Code Online (Sandbox Code Playgroud) 我正在使用 ubuntu 终端,我需要将文件中的特定行(第 11 位)移动到第一行,然后将最终结果传输到新文件中。原始文件包含数百行。
到目前为止,我尝试使用 sed 命令工具,但没有达到我想要的效果。这是我到目前为止得到的:
[mission 09] $ sed -n -e '1p' -e '11p' bonjour > bonjour2
Run Code Online (Sandbox Code Playgroud)
但它只显示新文件的第一行和第 11 行。但我希望新文件具有与其余原始行一起所需的修订位置。
输入 :
English: Hello
Turkish: Marhaba
Italian: Ciao
German: Hallo
Spanish: Hola
Latin: Salve
Greek: chai-ray
Welsh: Helo
Finnish: Hei
Breton: Demat
French: Bonjour
Run Code Online (Sandbox Code Playgroud)
期望输出
French: Bonjour
English: Hello
Turkish: Marhaba
Italian: Ciao
German: Hallo
Spanish: Hola
Latin: Salve
Greek: chai-ray
Welsh: Helo
Finnish: Hei
Breton: Demat
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?
我有一个巨大的文本文件 ~ 33Gb,由于它的大小,我只想阅读文件的前几行来了解文件的组织方式。我已经尝试过了head,但要花很长时间才能完成跑步。是不是因为在 UNIX 中,head需要先运行整个文件才能执行任何操作?如果是这样,是否有更快的方法来显示此类文件的一部分?