현재 특정 작업에 필요한 데이터를 수집하는 데 사용하는 2개의 bash 명령줄 문자열이 있습니다. 저는 일을 단순화하려고 노력하고 있으며 스크립트를 사용하지 않고 하나의 명령만 사용하여 데이터를 수집하려고 합니다.
cat
먼저 파일을 만들고 grep
명령을 파이프하면 정수 값만 표시됩니다. 그런 다음 해당 값을 방정식에 복사하여 붙여넣습니다. 방정식은 grep
첫 번째 명령의 ped 값을 제외하고 항상 동일하게 유지됩니다.
- 첫 번째 명령:
cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$'
- 두 번째 명령:
echo $(( (2147483633-"**grep value**")/5184000 ))
나는 이것을 달성하는 방법에 대해 혼란스러워합니다. 이에 대한 안내를 주시면 매우 감사하겠습니다!
답변1
이것은 명령입니다:
echo $(( (2147483633 - $(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$') )/5184000 ))
단순화가 수행되는 방법
먼저 다음 파이프라인을 고려하십시오.
cat /proc/zem0 |grep -i isrs`
이는 다음과 같이 단순화될 수 있습니다.
grep -i isrs /proc/zem0
따라서 첫 번째 명령 전체는 다음과 같습니다.
grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'
마지막 변경 사항은 명령 대체를 사용하여 첫 번째 명령을 두 번째 명령으로 바꾸는 것입니다 $(...)
. 따라서 다음을 대체합니다.
echo $(( (2147483633-"**grep value**")/5184000 ))
그리고:
echo $(( (2147483633-$(grep -i isrs /proc/zem0 | grep -Eo '[0-9]+$'))/5184000 ))
또 다른 단순화
grep
GNU 와 같은 Perl 스타일 정규식을 지원하는 경우 grep
주석에서 jimmij가 제안한 대로 더욱 단순화할 수 있습니다.
echo $(( (2147483633-$(grep -Pio 'isrs.*?\K[0-9]+$' /proc/zem0))/5184000 ))
답변2
John1024가 답변한 대로 명령 대체를 사용하는 것이 이 문제를 해결하는 가장 좋은 방법입니다.
또는 출력을 로 파이프하면 while read
공백으로 구분된 각 값이 선택한 변수에 할당됩니다. 이는 일반적으로 출력에 사용하려는 변수가 여러 개 있을 때 사용됩니다.
cat /proc/zem0 |grep -i isrs|grep -Eo '[0-9]+$' | while read myvariable ; do echo $(( (2147483633-"${myvariable}")/5184000 )) ; done
while read
열 형식 데이터, 인벤토리에 콘텐츠 삽입 등에 매우 유용합니다. 예를 들어 file1
콘텐츠가 다음과 같은 경우:
host1 192.168.0.100 web nyc1 00-23-54-EE-10-5C
host2 192.168.0.101 web nyc2 00-23-54-EE-10-5D
host3 192.168.0.102 web nyc1 00-23-54-EE-10-5E
그럼 넌 할 수 있어
cat file1 | while read host ip role dc mac ; do
cobbler system add --name=${host} --ip-address=${ip} --netmask=255.255.255.0 --mac-address=${mac} --comments="${role} ${dc}"
done