剪切命令包括混淆头部命令的空间?

时间:2014-10-07 05:26:54

标签: bash loops unix cut head

我正在尝试将cut命令的输出用于head命令以输出特定的行。我发现,如果将数字输入head命令10+,它可以正常工作。所以我想知道切割-c1-2是否包含跳转命令的单个数字的空白区域?

我的代码

#!/bin/bash
echo "Enter your name"
read input
cut -c5-19 filelist | grep -n "$input" | cut -c1-2 > cat

while read cat
do
head -$cat filelist | tail -1 > filelist2
done < cat

任何建议或建议将不胜感激!谢谢 :) 修改

FULLRanjit Singh   Marketing  Eagles       Dean Johnson   
FULLKen Whillans   Marketing  Eagles       Karen Thompson 
PARTPeter RobertsonSales      Golden TigersRich Gardener  
CONTSandeep Jain   President  Wimps        Ken Whillans   
PARTJohn Thompson  Operations Hawks        Cher           
CONTCher           Operations Vegans       Karen Patel    
FULLJohn Jacobs    Sales      Hawks        Davinder Singh 
FULLDean Johnson   Finance    Vegans       Sandeep Jain   
PARTKaren Thompson EngineeringVegans       John Thompson  
FULLRich Gardener  IT         Golden TigersPeter Robertson
FULLKaren Patel    IT         Wimps        Ranjit Singh   

这是'文件列表' 我得到的错误是“head:invalid trailing option - :” 如果我输入'Patel'作为名称,它就会起作用。

2 个答案:

答案 0 :(得分:0)

回答修订问题

替换:

cut -c5-19 filelist | grep -n "$input" | cut -c1-2 > cat

使用:

cut -c5-19 filelist | grep -n "$input" | cut -d: -f1 >cat

grep -n在行号和行的文本之间放置一个冒号。因此,很自然地使用冒号作为cut的字段分隔符,并请求cut返回第一个字段。

根据您显示的内容,脚本可以进一步简化为:

read -p "Enter your name: " input
linenum=$(cut -c5-19 filelist | grep -n "$input" | cut -d: -f1)
head -$linenum filelist | tail -1 > filelist2

回答原始问题

由于您没有向我们展示filelist,我们只能猜测问题。如果您对filelist包含空格是正确的,那么这就是解决方案。替换:

head -$cat filelist | tail -1 > filelist2

使用:

head -${cat## } filelist | tail -1 > filelist2

构造${cat## }从变量cat中删除所有前导空格。

答案 1 :(得分:0)

一些简单的说法:

首先,您可以使用echo ... read参数将read缩短为一个-p prompt,如:

read -r -p 'Enter your name: ' name

始终使用-r,否则转义处理的转义序列。

第二,脚本的其余部分执行以下操作:打印每一行,其中输入的名称位于位置5 .. 19 。这可以使用awk轻松完成,例如:

awk 'substr($0,5,15)~/pattern/'

substr$0(完整输入行)返回15个字符(5-19为15个字符),从位置5开始。 ~/pattern/匹配模式。名称必须是可变的,例如完整的命令可以是:

awk -v name=John 'substr($0,5,15)~name'

因此,您的脚本可以简化为以下两行:

#!/bin/sh
read -r -p 'Enter your name: '
awk -v name="${REPLY}" 'substr($0,5,15)~name' file1 > file2

此外,如果您想要输入名称的不区分大小写匹配,请使用

awk -v name="${REPLY}" 'tolower(substr($0,5,15))~tolower(name)'