我正在尝试将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'作为名称,它就会起作用。
答案 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)'